将项目推送到数组深度中的同一嵌套子项

时间:2018-01-26 03:21:46

标签: javascript algorithm

我无法弄清楚如何将项目推送到相同的嵌套数组,如:

var arr = ['foo', 'bar', 'buz', 'hello'];
 // It should be now look like this: 
const output = {name: 'foo', children: [
      {name: 'bar', children: [
          {name: 'buz', children: [
              {name: 'hello', children: []}
          ]}
      ]}
  ]};

5 个答案:

答案 0 :(得分:4)

使用reduce

const arr = ['foo', 'bar', 'buz', 'hello'];

const result = arr.reverse().reduce((acc, val) => ({name: val, children: [acc]}), {});

console.log(result);

答案 1 :(得分:3)

您可以使用reduceRight创建输出。



var arr = ['foo', 'bar', 'buz', 'hello'],
    result = arr.reduceRight((r, name) => ({name, children: (!Object.keys(r).length ? [] : [r])}), {});
console.log(result);




答案 2 :(得分:2)

使用递归函数:

const arr = ['foo', 'bar', 'buz', 'hello'];
const f = (arr) => ({name: arr.shift(), children: arr.length ? [f(arr)] : []});
const output = f(arr);

console.log(output);

答案 3 :(得分:0)

使用recursive功能

function nested (arr) {
  if (arr.length === 1)
    return { name: arr.shift(), children: [] };
  else if (arr.length > 1) 
    return { name: arr.shift(), children: [nested(arr)] };
}

var array = ['foo', 'bar', 'buz', 'hello']
console.log(nested(array))

答案 4 :(得分:0)

我现在对Array.reduce()方法如何工作有了一个想法,所以在没有递归方法的情况下发布了另一个答案。我认为对于大型树木结构会更好。 基本思想是简单地反转输入数组,然后将最里面的对象包装到另一个中,依此类推。

let arr = ['foo', 'bar', 'buz', 'hello'];
function nest(arr) {
    arr = arr.reverse();
    let out = [];
    arr.forEach(it => {
        if(out.length === 0) out = {name: it, children: []}
        else {
            out = {name: it, children: [out]}
        }
    });
    return out;
}