繁体   English   中英

如何遍历嵌套数据

[英]How to traverse nested data

我必须遍历大型数据集以收集javascript中节点的最终子元素。

我需要在子“详细信息”中找到一系列分支代码。 这是我尝试获得的输出:

[1000、1201、1202、2101、3101、3201]

 { "TITLE": { "FirstLevel": { "Details": { "Code": "01", }, "SecondLevel": [ { "Details": { "Description": "{desc}", }, "ThirdLevel": { "Details": { "Code": "01", }, "FourthLevel": [ { "Details": { "Code": "11", }, "Branch": { "Details": { "Code": "1000", } } }, { "Details": { "Code": "12", }, "Branch": [ { "Details": { "Code": "1201", } }, { "Details": { "Code": "1202", } } ] } ] } }, { "Details": { "Code": "100", }, "ThirdLevel": [ { "Details": { "Code": "02", }, "FourthLevel": { "Details": { "Code": "21" }, "Branch": { "Details": { "Code": "2101", } } } }, { "Details": { "Code": "03", }, "FourthLevel": [ { "Details": { "Code": "31", }, "Branch": { "Details": { "Code": "3101", } } }, { "Details": { "Code": "32", }, "Branch": { "Details": { "Code": "3201", } } } ] } ] } ] } } } 

我已经查看了有关更基本问题的答案,并尝试调整解决方案。

一种这样的解决方案采用传入的id,并将基于该id更新名称。 我以为我可以在这里使用类似的地图实现。 这是一个问题,因为数组不仅仅具有“子代”来表示将在哪里存在子节点。

 function update(object, passedId) { object.children.map((element, index) => { if (element.id === passedId) { console.log(index) object.children[index].name = "New Name" } if (element.children != null) { // condition for checking Nesting update(element, passedId) } }) console.log(object.children) } update(obj, "Branch"); 

接下来,我尝试了一种更简单的方法

 function getSubItem(obj) { for (item in obj) { for (subItem in obj[item]) { for (subsubItem in obj[subItem]){ console.log(obj[item][subItem][subsubItem]); } } } } getSubItem(obj) 

依此类推,在子项之后的子项之间添加子项,但是这种嵌套的循环看起来非常不稳定,而且由于分支可以嵌套在不同的区域,因此看起来也不可靠。 我在这里错过了一个简单的解决方案吗?

就像是:

function update (data, passedId, acc = []) {
    if (!_.isObject(data)) {
        return acc;
    }

    return _.reduce(_.values(data), (result, item) => {
        result = _.chain(item)
            .get(passedId)
            .thru(val => [val])
            .flatten()
            .compact()
            .map('Details.Code')
            .thru(vals => _.concat(result, vals))
            .value();
       return update(item, passedId, result);
    }, acc);
}

const res = update(data, 'Branch');

尝试这个:

 const obj = { "TITLE": { "FirstLevel": { "Details": { "Code": "01", }, "SecondLevel": [{ "Details": { "Description": "{desc}", }, "ThirdLevel": { "Details": { "Code": "01", }, "FourthLevel": [{ "Details": { "Code": "11", }, "Branch": { "Details": { "Code": "1000", } } }, { "Details": { "Code": "12", }, "Branch": [{ "Details": { "Code": "1201", } }, { "Details": { "Code": "1202", } } ] } ] } }, { "Details": { "Code": "100", }, "ThirdLevel": [{ "Details": { "Code": "02", }, "FourthLevel": { "Details": { "Code": "21" }, "Branch": { "Details": { "Code": "2101", } } } }, { "Details": { "Code": "03", }, "FourthLevel": [{ "Details": { "Code": "31", }, "Branch": { "Details": { "Code": "3101", } } }, { "Details": { "Code": "32", }, "Branch": { "Details": { "Code": "3201", } } } ] } ] } ] } } }; function transData(data, propertyName, path, result = []) { if (data instanceof Array) { data.forEach(obj => transData(obj, propertyName, path, result)); } else if (data instanceof Object) { let existProperty = Object.keys(data).indexOf(propertyName) > -1; if (existProperty) { getCode(data[propertyName], path, result); } else { Object.keys(data).forEach(key => transData(data[key], propertyName, path, result)); } } function getCode(data, path, result) { if (data instanceof Array) { data.forEach(obj => getCode(obj, path, result)); } else { if (typeof path !== 'undefined') { result.push(path.split(/\\./g).reduce((accumulator, val) => accumulator = accumulator[val], data)); } else { result.push(data); } } } return result; } console.log(transData(obj, 'Branch', 'Details.Code')); console.log(transData(obj, 'Branch')); 

尝试使用 Deepdash(deep Lodash扩展名)中的_.eachDeep方法。

这是您的情况: https : //codepen.io/yurigor/pen/moMpLV

var res = [];
_.eachDeep(data,function(value,key){
  if(key=="Branch"){
    if(!_.isArray(value)){
      value = [value];
    }
    _.each(value,function(v){
      if(v.Details&&v.Details.Code){
        res.push(v.Details.Code);
      }
    });
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM