Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在属性深度为n的对象列表中查找给定属性的所有出现?_Javascript_Arrays - Fatal编程技术网

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

Javascript 如何在属性深度为n的对象列表中查找给定属性的所有出现?,javascript,arrays,Javascript,Arrays,问题:给定对象列表(模型)和路径(例如:“organization.LongName”),我希望找到与此路径匹配的所有值,并将它们推送到数组中 这是一个带有此问题的plnkr: 以及一个显示示例对象和我感兴趣的值的插图 *编辑:看看这些答案,我的解释似乎不清楚。这里的重点是 路径是一个变量,并作为字符串传递。比如:“x.y.z…n” 我不知道它的深度提前,因此,我需要能够找到的财产无论深度的财产 使用现代浏览器,您可以使用该功能 var obj = { id: 0, organizat

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

这是一个带有此问题的plnkr:

以及一个显示示例对象和我感兴趣的值的插图

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

  • 路径是一个变量,并作为字符串传递。比如:“x.y.z…n”
  • 我不知道它的深度提前,因此,我需要能够找到的财产无论深度的财产

  • 使用现代浏览器,您可以使用该功能

    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);
    


    如果您坚持使用过时的浏览器,您可以使用上述MDN链接中兼容性部分提供的代码填充
    map()
    函数。

    好的,我的答案有点离谱,还引入了库依赖性,但是,如果你想要更灵活的东西,而不是直通的循环和代码,你可能想考虑允许你像JXPath一样与JavaScript对象/数组交互,只有一点。

    鉴于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"...]
    

    考虑一下这个解决方案

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

    getOccurences(someJsonData, 'organization.LongName')
    

    你可以试试这个。这个很好用

    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);
        }
    }
    
    函数getValuesFromArray(对象,属性)
    {
    //obj=要在其中查找属性的对象
    //property==您要查找的属性
    
    对于(var index=0;index)当您的最佳选择是使用其中一个答案中解释的JSONPath,并将其包装在一个函数中,该函数采用字符串路径并返回所需的属性。您确定吗?在任何情况下,您都不会触及属性,此时可能是类似“Organization.Department.LongName.Name”的内容这意味着您必须遍历整个objectyes,我确信您只需要使用这两个函数声明名为“myArray”的globel数组,并且您可以从任何递归中获取任何属性。