【问题标题】:Getting particular object from nested complex object从嵌套的复杂对象中获取特定对象
【发布时间】:2017-12-27 08:06:04
【问题描述】:

我有一个下面的 json,想要获取 id = 111 的对象,深度可能因 json 而异。

object = [ 
           { 
             id= 1,
             name : 'a',
             childNodes : [ {
                            id=11,
                            name:'aa',
                            childNodes:[{
                                         id: 111,
                                         name:'aaaa',
                                         childNodes:[]
                                        }]
                       }]

           }]

需要的输出{ id: 111, name:'aaaa', childNodes:[] }

寻找最快的算法或方法。超过 35000 个节点和 20 个深度的数据将非常庞大。

任何帮助将不胜感激。

【问题讨论】:

  • 对象中是否有任何可预测的结构?例如。如果父母的 ID 以 1 开头,孩子的 ID 也以 1 开头
  • 对不起,我们不能断言或依赖这样的。只有对结构确定的事情
  • 它们都是唯一的 ID,还是您希望返回一个包含所有具有匹配 ID 的对象的数组?
  • 是的,它们是唯一 ID,正在寻找具有特定 ID 的对象。

标签: javascript performance underscore.js lodash javascript-objects


【解决方案1】:

这是一个使用some的递归函数:

function findNested(arr, id) {
    var res;
    return arr.some(o => res = Object(o).id === id ? o 
                             : findNested(o.childNodes, id) ) && res;
}

var object = [{ 
    id: 1,
    name : 'a',
    childNodes : [ {
        id: 11,
        name:'aa',
        childNodes:[{
            id: 111,
            name:'aaaa',
            childNodes:[]
        }]
    }]
}];

console.log(findNested(object, 111));
console.log(findNested(object, 9));

【讨论】:

    【解决方案2】:

    您可以使用for...in 循环为此创建递归函数。

    var object = [{"id":1,"name":"a","childNodes":[{"id":11,"name":"aa","childNodes":[{"id":111,"name":"aaaa","childNodes":[]}]}]},{"id":2,"name":"a","childNodes":[{"id":22,"name":"aa","childNodes":[{"id":123,"name":"aaaa","childNodes":[]}]}]}]  
    
    function findById(data, id) {
      for(var i in data) {
        var result;
        if(data.id == id) return data
        if(typeof data[i] == 'object' && (result = findById(data[i], id))) return result
      }
    }
    
    console.log(findById(object, 111))
    console.log(findById(object, 22))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2019-11-02
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多