Когда объекты вложены внутри объектов, я не могу перебирать их с помощью обычного цикла for in. Я погуглил и обнаружил, что мне нужно создать рекурсивную функцию, которая будет проверять, является ли свойство объектом. Я написал рекурсивную функцию следующим образом: `
function isObject(value){
return (typeof(value)==='object');
}
``
function listToArray(list){
let arr=[];
for (let elem in list){
if (isObject(list[elem])===false){
console.info(list[elem]);
}
else if (isObject(list[elem])){
listToArray(list[elem]);
}
}
return arr;
}
`
эта функция работает хорошо, она глубоко перебирает все объекты, вложенные в объекты, и console.info регистрирует все значения свойств. и возвращает пустой массив.
однако, когда я заменяю console.info(list[elem]))
на arr.push(list[elem])
, чтобы реальная функциональность работала, в первый больший объект помещаются только те свойства, которые не являются объектами.
Это проблема кодирования в книге Eloquent JavaScript. Мне не нужен ответ на эту проблему (на самом деле ответы есть в книге). Я просто хочу знать, почему console.info работает, а arr.push — нет. потому что мне это кажется таким странным, и я не могу найти этому объяснения.
Редактировать: например этот объект
let list = { value : 1,
rest: { value:2,
rest:{value:3,
rest:null}
}
}
listToArray(list)
должен вернуться [1,2,3]
Я отредактировал свой пост и добавил пример, чтобы показать, что я имел в виду более четко
Это потому, что вы не фиксируете возвращаемый массив в своем блоке elseif
function isObject(value){
return (typeof(value)==='object');
}
function listToArray(list){
let arr=[];
for (let elem in list){
if (isObject(list[elem])===false){
arr.push(list[elem]);
}
else if (isObject(list[elem])){
retArr = listToArray(list[elem]);
arr = [...arr, ...retArr];
}
}
return arr;
}
Да, теперь это кажется таким очевидным. Каждый раз, когда функция выполняет рекурсию, массив снова становится пустым из-за let arr=[]
вверху. Но почему значение подталкивается к первому значению. разве `listToArray(list)' не должен возвращать [3] вместо [1]?
потому что первый вызов функции listToArray
.. проверял два ключа value
и rest
. value
(1) помещается в arr
.., а для rest
вы сделали рекурсивный вызов без возврата, поэтому, по сути, он игнорировал все, что произошло в этом и последующих рекурсивных вызовах. и как только весь рекурсивный стек выталкивается ... вы только что вернули arr
, в котором есть только 1.
теперь все ясно. большое спасибо
Можете ли вы описать свою проблему немного яснее? Вы хотите, чтобы все элементы, которые не являются объектами, были сгруппированы и помещены в массив?