我们有一个像这样的数组。我想添加新的孩子并增加“ 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”。
在此先感谢您的帮助。
最佳答案
尚未完全充实,但总体思路如下:由于它是一个嵌套很深的结构,我们通过将结构转换为字符串并通过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})
}