如何在树结构中连接两个对象数组?

时间:2017-08-19 05:05:26

标签: javascript arrays

我有2个对象数组 第一个数组


    [
      { 
        value: 'Node 1',
        id: 1,
        childs: [
          {
            value: 'Node 2',
            id : 2,
            childs: [
              {
                value: 'Node 3',
                id: 3
              },
              {
                value: 'Node 4',
                id: 4           
              }
            ]
          }
        ]
      }
    ] 

和第二个数组


    [
      { 
        value: 'Node 1',
        id: 1,
        childs: [
          {
            value: 'Node 5',
            id : 5
          }
        ]
      }
    ]

我不明白如何在树形结构中连接这些对象数组。 我需要这个结果


    [
      { 
        value: 'Node 1',
        id: 1,
        childs: [
          {
            value: 'Node 2',
            id : 2,
            childs: [
              {
                value: 'Node 3',
                id: 3
              },
              {
                value: 'Node 4',
                id: 4           
              }
            ]
          },
          {
            value: 'Node 5',
            id : 5
          }
        ]
      }
    ]

并且这些数组可能更难以拥有更多的孩子。

我怎样才能得到我想要的东西?

3 个答案:

答案 0 :(得分:1)

试试这个Array#forEach函数和Array#filter

var arr = [ { value: 'Node 1', id: 1, childs: [ { value: 'Node 2', id : 2, childs: [ { value: 'Node 3', id: 3 }, { value: 'Node 4', id: 4 
} ] } ] } ];
var arr2= [ { value: 'Node 1', id: 1, childs: [ { value: 'Node 5', id : 5 } ] } ]

arr.forEach(function(a){
    var k =arr2.filter(i=> a.value == i.value);
    a.childs.push(...k[0].childs)
  })
  
console.log(arr)

答案 1 :(得分:1)

您可以通过散列实际级别的id来使用迭代和递归方法。



function update(target, source) {
    var hash = Object.create(null);
    target.forEach(function (o) {
        hash[o.id] = o;
    });
    source.forEach(function (o, i, a) {
        if (hash[o.id]) {
            o.children && update(hash[o.id].children = hash[o.id].children || [], o.children)
        } else {
            target.push(o);
        }
    });
}
var array1 = [{ value: 'Node 1', id: 1, children: [{ value: 'Node 2', id: 2, children: [{ value: 'Node 3', id: 3 }, { value: 'Node 4', id: 4 }] }] }],
    array2 = [{ value: 'Node 1', id: 1, children: [{ value: 'Node 5', id: 5 }] }];

update(array1, array2);

console.log(array1);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:0)

您正在寻找concat()方法。 See this. 所以你的代码应该是这样的:

array1[0].children.concat(array2[0].children);