【问题标题】:Javascript/jQuery - For each array iteration trough all multidimensional keysJavascript/jQuery - 对于所有多维键的每个数组迭代
【发布时间】:2020-02-23 17:06:50
【问题描述】:

我有一个具有以下结构的多维数组:

[13] => Array
    (
        [id] => 51
        [text] => Corporate
        [seltext] => Corporate
        [parent_id] => 0
        [object_type] => folder
        [corefilename] => 
        [userUNIQUE] => 
        [nodes] => Array
            (
                [0] => Array
                    (
                        [id] => 50
                        [text] =>  Due diligence
                        [seltext] => Due diligence
                        [parent_id] => 51
                        [object_type] => folder
                        [corefilename] => 
                        [userUNIQUE] => 
                    )

                [1] => Array
                    (
                        [id] => 2
                        [text] =>  Drafts
                        [seltext] => Drafts
                        [parent_id] => 51
                        [object_type] => folder
                        [corefilename] => 
                        [userUNIQUE] => 
                        [nodes] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 6
                                        [text] =>  de
                                        [seltext] => Decisions                                                                  [parent_id] => 2
                                        [object_type] => folder
                                        [corefilename] => 
                                        [userUNIQUE] => 
                                        [nodes] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [id] => 44
                                                        [text] =>  
                                                        [parent_id] => 6
                                                        [object_type] => file
                                                        [corefilename] => f-8TYO89KHTK1BNV4QMMAW6GHEEDRREECP1VDV4Y6VLXWM7XS97V4LCUWXJFM6E61VXF
                                                        [userUNIQUE] => 

我想获取一直填充到数组下方的所有“id”值 - 节点。我尝试过迭代,但我唯一能达到的级别是第一个。

这是我试图运行但没有成功的功能:

 var childs=$('#tree').treeview('getSelected', loc);

             function getValuesByKey(object, key) {
         var values = [];
         recursiveFx(object);
         function recursiveFx(object) {
           for (var property in object) {
             if (object.hasOwnProperty(property)) {
               if (typeof object[property] == "object") {
                recursiveFx(object[property]);
               } else {
                 try {
                   if (isDefined(object[key])) {
                     console.log('value:',object[key]);
                     values.push(object[key]);
                   }
                 } catch (e) {

                 }
               }
             }
           }
         }
         return values;
       }
getValuesByKey(childs, 'id');

我做错了什么?

【问题讨论】:

  • 这似乎是递归的好地方。但是您能否提供一些数据的 sn-p,以便我们为您提供帮助?
  • 你是对的!我忘记发布代码 sn-p。线程已更新。

标签: javascript arrays iterator iteration


【解决方案1】:

据我从您的数据中看到的,您首先遍历的是数组,而不是对象。相同的解决方案也可以用于对象,但是,必须对属性和数组元素进行迭代,除非您知道某些特定属性将始终包含所有对象的数组。

这只是一个示例数据,为了节省时间:

var data = [
    {"id": 50},
    {
        "id": 35,
        "nodes": [
            {"id": 3},
            {"id": 7},
            {
                "id": 9,
                "nodes": [
                    {"id": 0},
                    {"id": 1}
                ]
            },
        ]
    },
];

接下来是获取对象中的属性,并检查它是否具有该属性,这将始终为真。

我建议您检查特定字段是否为数组,使用Array.isArray,并将新数组赋予recursiveFx。

function getValuesByKey(arr, key) {
         var values = [];
         recursiveFx(arr);

         function recursiveFx(arr) {
           for (let el in arr) {
               object = arr[el];
               for(let property in object){
                     if(property === key){
                       values.push(object[property]);
                     } else if(Array.isArray(object[property])){
                       recursiveFx(object[property])
                     }
                }
           }

         }
         return values;
}

console.log(getValuesByKey(data, 'id'));

【讨论】:

  • Animus,你拯救了这一天!非常感谢您的宝贵帮助!
【解决方案2】:

我认为您的数据是“数组”? 但使用了var property in object

这里有一个简单的递归函数来解决这类问题。

let test_data = 
[{
        "id": 1,
        "somekey": "someval1",
        "nodes": [{
            "id": 2,
            "somekey": "someval2",
            "nodes": [{
                "id": 4,
                "somekey": "someval4"
            }, {
                "id": 5,
                "somekey": "someval5",
                "nodes": [{
                    "id": 6,
                    "somekey": "someval6"
                }]
            }]
        }]
    },
    {
        "id": 3,
        "somekey": "someval3"
    }
]

及递归函数:

const nodes_key = "nodes";
const key = "id";
let values = [];

function getValuesByKey(ary, key, nodes_key){
    for ( object of ary ){
        if (object.hasOwnProperty(key)) {
            values.push(object[key]) ;
        }
        if ( object.hasOwnProperty(nodes_key) ){
            getValuesByKey(object[nodes_key], key, nodes_key)
        } // if it has child-nodes, just do same as above.. (pushes the value of key)
    } // retrive each object in an Array
}

输出:

getValuesByKey(test_data, key, nodes_key)

> values
[ 1, 2, 4, 5, 6, 3 ]

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2023-03-08
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多