如何使用Node.js将新ID递增并添加到Json数组树结构中的新节点

时间:2019-07-02 13:57:09

标签: javascript arrays object

我们有一个像这样的数组。我想添加新的孩子并增加“ id”。

[  
   {  
      "name":"Headcount",
      "id":1,
      "parentId":0,
      "is_open":true,
      "children":[  
         {  
            "name":"temp1",
            "id":2,
            "parentId":1,
            "is_open":true,

         },
         {  
            "name":"Temp",
            "id":90
         }
      ]
   },
{  
      "name":"temp2",
      "id":4,
      "parentId":0,
      "is_open":true,
      "children":[  
         {  
            "name":"temp3",
            "id":5,
            "parentId":4,
            "is_open":true,
            "children":[  
               {  
                  "name":"temp4",
                  "id":6,
                  "parentId":5,
                  "is_open":true   }
      ]
   }
]

我们要向新添加的子节点添加一个新ID。

我们尝试通过在数组中找到最大值来添加新ID,并将其添加到新的子节点中。

我们尝试的代码是

var res = Math.max.apply(Math,data.map(function(o){return o.id;}))
         console.log("Max ID res:"+res);

给出的答案是“ 4”,但我们希望答案是“ 90”,因为它是最大的数字。 如何遍历子节点并查找/增加新的“ id”。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尚未完全充实,但总体思路如下:由于它是一个嵌套的结构,我们通过将结构转换为字符串并通过regex遍历,避免了递归或任何深度搜索。

首先,我们获得所有"id"条目,然后将其用作新匹配项的起点,这些新匹配项将为我们返回每个索引之后的数字。然后对这些数字应用减法来找到最大值,然后完成。现在,您可以将数字应用到新结构中。

我不确定结构的哪一部分是待搜索部分的一部分,因此我只是在整个结构中搜索了最高的id

let data = [  
   {  
      "name":"Headcount",
      "id":1,
      "parentId":0,
      "is_open":true,
      "children":[  
         {  
            "name":"temp1",
            "id":2,
            "parentId":1,
            "is_open":true,

         },
         {  
            "name":"Temp",
            "id":90
         }
      ]
   },
{  
      "name":"temp2",
      "id":4,
      "parentId":0,
      "is_open":true,
      "children":[  
         {  
            "name":"temp3",
            "id":5,
            "parentId":4,
            "is_open":true,
            "children":[  
               {  
                  "name":"temp4",
                  "id":6,
                  "parentId":5,
                  "is_open":true   }
      ]
   }
]
}]

let f = (data) => {
  // https://stackoverflow.com/a/3410557/9758920
  let s = JSON.stringify(data), regex = /"id"/gi, result, indices = [];
  while ( (result = regex.exec(s)) ) {
    indices.push(result.index);
  }

  let ids = []
  for (i of indices) {
    ids.push(s.slice(i,i+10).match(/\d+/g)[0]) // not optimal by any means
  }
  return ids.reduce((m,c) => (m > c) ? m : c)
}

console.log(f(data))

以下操作应该更快一些:

let f = (data) => {
  return JSON.stringify(data)
          .match(/"id":\d+/g)
          .reduce((m,c) => {
            let tmp = +c.slice(5);
            return (m > tmp) ? m : tmp})
}