@1nsayt

Как обойти все дерево через array.prototype.reduce?

Необходимо обойти все дерево и поменять название ключей, с одного имени на другой.Моя функция меняет name на key везде кроме последнего элемента массива с именем "Tom"
const data = [
    {
		name: 'Stas',
		age: 40,
		children: []
	},
	{
		name: 'Pavel',
		age: 40,
		children: [
		{
			name: 'Dmitri',
			age: 20,
			children:[]	
		},
		{
			name: 'Sasha',
			age: 15,
			children:[
                {
					name:'Alexey',
					age: 34,
					children:[]
				}
			]
		}
		
		]
	},
    {
		name: 'Tom',
		age: 22,
		cildren:[
            {
				name: 'Hack',
				age: 44,
				children:[]
			},
		    {
				name: 'Hack',
				age: 44,
				children:[]
			}
                ]
		
	}


] 
const traversal= arr => 
	(arr || []).reduce((acc,cur,ind,arr)=>{
	if(cur.children === undefined){
	return acc
	} else if(cur.children.length){
		acc = [...acc, {key: cur.name, age: cur.age, children: traversal(cur.children)}]
        }else{
		acc = [...acc, {key: cur.name, age: cur.age, children: cur.children}]
	}
	return acc
},[])
  • Вопрос задан
  • 323 просмотра
Решения вопроса 2
@StockholmSyndrome
const traversal = (arr, prevKey, key) => arr.map((o) => {
  const newObj = {
    ...o, 
    [key]: o[prevKey], 
    children: traversal(o.children, prevKey, key)
  }; 
  delete newObj[prevKey];
  return newObj;
});

const newArr = traversal(data, 'name', 'key');


P.S. ваш код не работает из-за опечатки в названии свойства в последнем объекте
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
Во-первых - опечатка:

cildren

Во-вторых - зачем reduce? Достаточно map:

const copyTree = (tree, f) =>
  tree.map(n => {
    n = f instanceof Function ? f(n) : { ...n };
    if (n.children instanceof Array) {
      n.children = copyTree(n.children, f);
    }
    return n;
  });


const dataCopy = copyTree(data, ({ name: key, ...x }) => ({ key, ...x }));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы