Задать вопрос
@newaitix

Как собрать все элементы объекта?

Есть такой код.
fetch('...').then((res)=>{
	return res.json();
}).then(function(res){
	var json=res.response;
	for(var i=0; i<json.length; i++){
		console.log(json[i])
		if(json[i].children!=undefined&&json[i].children.length>0){
			for(var j=0; j<json[i].children.length; j++){
				console.log(json[i].children[j]);
				if(json[i].children[j].children!=undefined&&json[i].children[j].children.length>0){
					for(var k=0; k<json[i].children[j].children.length; k++){
						console.log(json[i].children[j].children[k]);
						if(json[i].children[j].children[k].children!=undefined&&json[i].children[j].children[k].children.length>0){
							for(var l=0; l<json[i].children[j].children[k].children.length; l++){
								console.log(json[i].children[j].children[k].children[l]);
							}
						}
					}
				}
			}
		}
	}
});

Можно ли как то компактней записать это чтоб избежать это множество вложенных циклов?
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

const getFromTree = (tree, childrenKey, getter = n => n) =>
  Array.isArray(tree)
    ? tree.flatMap(n => [
        getter(n),
        ...getFromTree(n[childrenKey], childrenKey, getter),
      ])
    : [];

// или

function* flatTree(tree, childrenKey) {
  if (
    tree instanceof Object &&
    tree[Symbol.iterator] instanceof Function
  ) {
    for (const n of tree) {
      yield n;
      yield* getFromTree(n[childrenKey], childrenKey);
    }
  }
}

Рекурсии нет:

const getFromTree = function(tree, childrenKey, getter = n => n) {
  const result = [];

  for (const stack = this(tree); stack.length;) {
    const n = stack.pop();
    result.push(getter(n));
    stack.push(...this(n[childrenKey]));
  }

  return result;
}.bind(x => x instanceof Array ? [...x].reverse() : []);

// или

const flatTree = function*(tree, childrenKey) {
  const stack = [];

  for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
    if (i === arr.length) {
      [ i, arr ] = stack.pop();
    } else {
      yield arr[i];
      stack.push([ i, arr ]);
      [ i, arr ] = this(arr[i][childrenKey]);
    }
  }
}.bind(x => [ -1, x?.constructor === Array ? x : [] ]);

Перебираем вложенные объекты:

getFromTree(tree, 'children').forEach(n => console.log(n));

// или

for (const n of flatTree(tree, 'children')) {
  console.log(n);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы