嵌套循环数组

时间:2014-06-25 09:24:27

标签: javascript jquery arrays

我正在尝试循环数组的所有值,并将该循环数据推送到另一个数组中。

例如:

{
"cat": [
    {
        "view": [
            {
                "ent": [
                    {
                        "data": [
                            {}
                        ],
                        "label": "abcd"
                    },
                    {
                        "data": [
                            {}
                        ],
                        "label": "efgh"
                    }
                ]
            }
        ]
    }
]

我需要迭代直到标签并将标签的所有值都放入数组中。这就是我尝试过的。 问题是我只是获取标签的最后一个值,即在我的数组变量中获胜。

JS:

var ArrL = scope.res.cat;
var Array = [];
for(var i=0;i<ArrL.length;i++){
    var ArrF = ArrL[i].view;
    for(var j=0;j<ArrF.length;j++){
        var ArrE = ArrF[j].ent;
        for(var k=0;k<ArrE.length;k++){
            var ArrLa = ArrE[k].label;

        }

    }
    Array.push(ArrLa);
}
console.log(Array);

预期输出为['joy','won'],但运行程序后的输出为['won']

3 个答案:

答案 0 :(得分:2)

由于你的Q被标记为jquery,你可以这样做:

var cat = [
    {
        view: [
            {
                ent: [
                    {
                        data: [
                            {
                                key: "id",
                                value: "00"
                            }, 
                            {
                                key: "cid",
                                value: "123"
                            }
                        ],
                        label: "joy"
                    }, 
                    {
                        key: "id",
                        value: "11"
                    }, 
                    {
                        key: "cid",
                        value: "234"
                    }
                ], // end ent
                label: "won"
            }, 

        ] //end view
    }
];

var labels = [];

$.map( cat, function flattener( node ) {
    if ( $.isPlainObject( node ) && node.hasOwnProperty('label') ) {
        labels.push( node.label );
    }
    return ($.isArray( node ) || $.isPlainObject( node )) ? $.map( node, flattener) : node;
} );

console.log( labels );

小提琴:http://jsfiddle.net/fFwQ6/

需要注意的是,订单将由深度决定:更深层次的标签最后。

更新: 很容易将它变成实用功能:

function grabKeys( source, keyName ) {
    var values = [];

    $.map( source, function flattener( node ) {
        if ( $.isPlainObject( node ) && node.hasOwnProperty(keyName) ) {
            values.push( node[keyName] );
        }
        return ($.isArray( node ) || $.isPlainObject( node )) ? $.map( node, flattener) : node;
    } );

    return values;
}


var labels = grabKeys( cat, 'label' );
var cids = grabKeys( cat, 'cid' );

更新2:因为&#39; cid&#39;是一个关键值而不是名称,我们必须使用略有不同的方法。对不起,我之前没有注意到它。

function grabPairedKeys( source, keyValue, keyName1, keyName2 ) {
    keyName1 = keyName1 || 'key';
    keyName2 = keyName2 || 'value';

    var values = [];

    $.map( source, function flattener( node ) {
        if ( $.isPlainObject( node ) && node.hasOwnProperty(keyName1) && node.hasOwnProperty(keyName2) && node[keyName1] === keyValue ) {
            values.push( node[keyName2] );
        }
        return ($.isArray( node ) || $.isPlainObject( node )) ? $.map( node, flattener) : node;
    } );

    return values;
}


var labels = grabKeys( cat, 'label' );
var cids = grabPairedKeys( cat, 'cid' );

答案 1 :(得分:1)

你应该在循环中使用推送。

    for(var i=0;i<ArrL.length;i++){
                ArrF = ArrL[i].view;
                for(var j=0;j<ArrF.length;j++){
                    ArrE = ArrF[j].ent;
                    for(var k=0;k<ArrE.length;k++){
                        ArrLa = ArrE[k].label;
                        Array.push(ArrLa);
                    }

                }

            }

答案 2 :(得分:1)

好吧,在迭代ArrLa数组后,只推送分配给view的最后一个值。相反,当你遇到它时立即推动价值:

var Array = [];
for(var i=0;i<ArrL.length;i++){
    var ArrF = ArrL[i].view;
    for(var j=0;j<ArrF.length;j++){
        var ArrE = ArrF[j].ent;
        for(var k=0;k<ArrE.length;k++){
             Array.push(ArrE[k].label);
        }
    }
}
console.log(Array);