簡體   English   中英

Javascript/jQuery - 對於所有多維鍵的每個數組迭代

[英]Javascript/jQuery - For each array iteration trough all multidimensional keys

我有一個具有以下結構的多維數組:

[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”值 - 節點。 我試過迭代,但我唯一能達到的水平是第一個。

這是我試圖運行但沒有成功的 function:

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

我究竟做錯了什么?

據我從您的數據中看到,您首先遍歷數組,而不是通過 object。 object 也可以使用相同的解決方案,但是,必須對屬性和數組元素進行迭代,除非您知道某些特定屬性將始終包含所有對象的數組。

這只是一個示例數據,以節省時間:

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

接下來是您獲取 object 中的屬性,並檢查它是否具有該屬性,這將始終為真。

我建議您使用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'));

我認為您的數據是“數組”? var property in object

這是一個簡單的遞歸 function 來解決這類問題。

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"
    }
]

和遞歸 function:

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
}

Output:

getValuesByKey(test_data, key, nodes_key)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM