在深度javascript数组

时间:2017-03-30 00:16:49

标签: javascript arrays typescript find lodash

我想知道是否有人可以帮助弄清楚我如何在一个可以在深度数组中找到的对象中设置属性的值。

以下是树阵列

的示例

我想知道如何插入

var newObjectToInsert = {id: 999, name: 'new name'};

节点中的

id === 3901

的对象数组



var tree = [
  {
    id: 1,
    name: 'Level 1 - A',
    nodes: [
      {
        id: 33,
        name: 'Level 2 = A',
        nodes: []
      },
      
      {
        id: 21,
        name: 'Level 2 = B',
        nodes: []
      }
    ]
  },
  
  {
    id: 2,
    name: 'Level 1 - B',
    nodes: []
  },
  
  {
    id: 3,
    name: 'Level 1 - B',
    nodes: [
      {
        id: 65,
        name: 'Level 2 = A',
        nodes: []
      },

      {
        id: 124,
        name: 'Level 2 = A',
        nodes: [
          {
            id: 3901,
            name: 'Level 3 - A'
          },
          
          {
            id: 29182,
            name: 'Level 3 - B',
            nodes: [
              {
                id: 32423413,
                name: 'Level 4 - A'
              }
            ]
          }
        ]
      },
  
      {
        id: 534,
        name: 'Level 2 = A',
        nodes: []
      }
    ]
  },
];




2 个答案:

答案 0 :(得分:1)

您可以使用本机Array#some来实现递归遍历。使用这种方法的一个优点是它已经提供了一种机制来一旦找到我们想要插入新对象的节点就停止遍历。

var inserted = tree.some(function cb(v) {
  var nodes = v.nodes || [];
  return v.id === nodeId?
    (v.nodes = nodes).push(newObjectToInsert):
    nodes.some(cb);
});



var tree = [{
    id: 1,
    name: 'Level 1 - A',
    nodes: [{
        id: 33,
        name: 'Level 2 = A',
        nodes: []
      },

      {
        id: 21,
        name: 'Level 2 = B',
        nodes: []
      }
    ]
  },

  {
    id: 2,
    name: 'Level 1 - B',
    nodes: []
  },

  {
    id: 3,
    name: 'Level 1 - B',
    nodes: [{
        id: 65,
        name: 'Level 2 = A',
        nodes: []
      },

      {
        id: 124,
        name: 'Level 2 = A',
        nodes: [{
            id: 3901,
            name: 'Level 3 - A'
          },

          {
            id: 29182,
            name: 'Level 3 - B',
            nodes: [{
              id: 32423413,
              name: 'Level 4 - A'
            }]
          }
        ]
      },

      {
        id: 534,
        name: 'Level 2 = A',
        nodes: []
      }
    ]
  },
];

var newObjectToInsert = {id: 999, name: 'new name'};
var nodeId = 3901;

var inserted = tree.some(function cb(v) {
  var nodes = v.nodes || [];
  return v.id === nodeId?
    (v.nodes = nodes).push(newObjectToInsert):
    nodes.some(cb);
});

console.log(tree);

body > div { min-height: 100%; top: 0; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你有一个递归结构。因此,您访问了所有需要访客的项目。

伪代码:

function visit(visitor, tree) {
  visitor(tree);
  items.nodes.forEach(subTree => visit(visitor, subTree));
}

并使用

visit(node => {
  if (node.id === 'whatever'){
    node.push({yournode});
  }
}, tree);