Как увеличить и добавить новый идентификатор в новый узел в древовидной структуре массива Json с помощью Nodejs - PullRequest
1 голос
/ 02 июля 2019

у нас есть такой массив.Я хочу добавить нового потомка и увеличить «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   }
      ]
   }
]

Мы хотим добавить новый идентификатор для вновь добавленного дочернего узла.

мы попытались добавить новый идентификатор, найдя максимальное значение в массиве и добавив его в новыйдочерний узел.

код, который мы пробовали:

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

Он дает ответ как «4», но мы хотим, чтобы он был «90», так как это наибольшее число.как перебирать дочерние узлы и находить / увеличивать новый «id».

Заранее благодарим за помощь.

1 Ответ

1 голос
/ 02 июля 2019

Не полностью раскрыто, но общая идея заключается в следующем: поскольку это сильно вложенная структура, мы избегаем рекурсии или любого глубокого поиска, превращая структуру в строку и пересекая ее затем через регулярное выражение.

Сначала мы получаем все "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})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...