如何在属性深度为n的对象列表中找到所有出现的给定属性?

时间:2013-11-21 10:13:04

标签: javascript arrays

问题:鉴于对象(模型)和路径列表(例如:“organization.LongName”),我希望找到与此路径匹配的所有值并将它们推送到数组。

这是解决此问题的一个问题:Plnkr

图示了一个示例对象和我感兴趣的值

enter image description here

*编辑:看看这些答案,我的解释似乎不清楚。这里的重点是

  1. 路径是一个变量并以字符串形式传递。喜欢:“x.y.z ... n”
  2. 我事先并不知道它的深度,因此无论物业的深度如何,我都需要能够找到物业。

4 个答案:

答案 0 :(得分:1)

好的,我的回答有点过时,并且还引入了库依赖项,但如果你想要一些更灵活的东西而不是直接循环和代码,你可能要考虑JSONPath哪个允许您像使用XPath一样与JavaScript对象/数组进行交互,只需要一点different syntax

鉴于plnkr示例中的模型,以下内容将为您提供所需的列表:

jsonPath(model,'$..organization..LongName');

// $ = the root element
// .. = descend until whatever comes next (either organization or LongName)
// organization|LongName = the object you're looking for

结果摘录如下:

["Group A", "Group B", "Group A", "Group B", "Group A", "Group B", "Group A", "Group B", "Group C", "Group D"...]

答案 1 :(得分:0)

使用现代浏览器,您可以使用Array.map()功能。

var obj = {
  id: 0,
  organization:[
  {id:0, LongName:"group A"},
  {id:1, LongName:"group B"}
  ],
  number: 123,
  LongName: "John World"
};

var groupLabels = obj.organization.map(function(e){
    return e.LongName;
});

console.log(groupLabels);

JS Fiddle

如果您遇到了坚持使用过时浏览器的地方,可以使用上述MDN链接中兼容性部分提供的代码来重新调整map()函数。

答案 2 :(得分:0)

考虑这个解决方案

function getOccurences(jsonObject, path) {
  path = '$..' + path.replace('.','..');
  return jsonPath(jsonObject, path);
}
你可以这样称呼它:

getOccurences(someJsonData, 'organization.LongName')

答案 3 :(得分:0)

你可以试试这个完美的作品。

function getValuesFromArray(obj, property)
{
    // obj = your object in which you want to find your property
    // property == your property which you want to find
    for(var index=0; index<obj.length; index++)
    {
        if(obj[index] instanceof Object)
            getValuesFromObject(obj[index], property);
        else if(obj[value] instanceof Object)
            getValuesFromObject(obj[value], property);
    }
}

function getValuesFromObject(obj, property)
{
    // obj = your object in which you want to find your property
    // property == your property which you want to find
    for(value in obj)
    {
        if(value == property)
            myArray.push(obj[property]);
        else if(obj[value] instanceof Array)
            getValuesFromArray(obj[value], property);
        else if(obj[value] instanceof Object)
            getValuesFromObject(obj[value], property);
    }
}