我正在尝试循环数组的所有值,并将该循环数据推送到另一个数组中。
例如:
{
"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']
。
答案 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);