2

非常に複雑な多次元配列があります。

各項目は次のようになります (このコードは、配列にプッシュされる var を示しています)。

var arrayItem = {
                'itemId': '00001',
                'itemName': 'Biscuits',
                'parentId': 'Food',
                'children': []
            };

itemId は常に一意です。children 配列には、さらに多くarrayItemの (s) が取り込まれます。したがって、配列は多くのレベルを持つことができます (最大 9 の可能性がありますが、それ以上の可能性もあります) - 基本配列には x 個のオブジェクトがあり、それぞれに y 個の子オブジェクトなどがあります...

特定のを検索する方法はありますかitemId。さまざまな .each メソッドを試しましたが、多次元配列のすべてのレベルを検索できないようです。

どんな助けでも大歓迎です。

4

1 に答える 1

7

編集:

数年分の経験とArrayプロトタイプの改良を経て、私なら次のように問題を解決します。

function find(arr, id) {
    return arr.find(item => item.itemId === id) 
        || arr.reduce((found, curr) => found || find(curr.children, id), undefined)
}

これにより、オブジェクト グラフの幅優先検索が実行さundefinedれ、探している ID が含まれていない場合は返されます。

元の答え:

function finder(arr, id){
    arr = [].concat(arr);
    for(var i = 0; i<arr.length; i++){
        if(arr[i].itemId == id){
            return arr[i];
        }else if(arr[i].children.length){
            var val = finder(arr[i].children, id);
            if(val){
                return val;
            }
        }
    }
    return null;        
}

finder に配列と目的の ID を渡すと、その ID を持つ配列アイテムが検索されて返されます。

次のように使用します。

var arr = [{
    'itemId': '00001',
        'itemName': 'Biscuits',
        'parentId': 'Food',
        'children': [{
        'itemId': '00002',
            'itemName': 'Sweet',
            'parentId': 'Biscuits',
            'children': [{
            'itemId': '00004',
                'itemName': 'Chocolate',
                'parentId': 'Sweet',
                'children': []
        }]
    }, {
        'itemId': '00003',
            'itemName': 'Salty',
            'parentId': 'Biscuits',
            'children': []
    }]
}];

var chocolate = finder(arr,"00004");

デモはこちら: http://jsfiddle.net/mVyha/

于 2012-11-15T13:27:03.617 に答える