2017-09-13 176 views
0

我正在循环数组中的二维对象。我目前做的方式如下:循环访问数组中的对象

我的阵列看起来像这样

var myarray = [ 
    0: { 
      child_obj: {} 
     } 
    1: {//etc} 
]; 

而且我通过第二级对象循环这样

jQuery.each(myarray, function(i, first) { 
    jQuery.each(first.child_obj, function(j, second) { 
     //do stuff 
    } 
    }); 
}); 

所以这是一个循环内循环。它工作正常,但它看起来不太整齐,我觉得可能有更好(更短)的方法来做到这一点。 我这样做的原因是因为我需要做所有child_obj s的东西。

值得一提:

  • 我用jQuery.each()因为这允许通过对象循环,而for().map()等无法处理正确。
  • 我无法更改阵列或其内容的结构
  • 我不需要使用索引(参数ij)。

有没有更好的方法?

+0

Array.prototype.forEach() – user7951676

+0

@ user7951676你能解释我应该如何使用它来获得第二级对象? – poepje

+0

@JaromandaX你是什么意思? – poepje

回答

0

这不是一个更好的方法,它更像备用。

for (var i = 0; i < myarray.length; i++) 
{ 
    var child_obj = myarray[i].child_obj; 
    // get the keys of this object 
    var keys = Object.keys(child_obj); 

    // loop all those keys 
    for (var keyi = 0; keyi < keys.length; keyi++) 
    { 
    var key = keys[keyi]; 
    // get the objects item based on key; 
    var item = child_obj[key]; 
    } 
} 

但在这里您可以直接更改它们的值,因为您正在迭代原始变量。

希望使用下划线-JS库有助于

0

,你可以做到以下几点:

var first = _.map(myarray, element => { return element.child_obj; }); 
_.each(first, element => {/*do stuff*/}); 
+0

这不会循环通过子对象;如果我在顶级循环中用'first.child_obj'做了一些事情,在我的jQuery.each中,我得到了相同的结果。 – poepje

1

如果你想沟的jQuery(和它在。每个速度慢),并使用ES2015 +

var myarray = [ 
 
    { 
 
     child_obj: {a:1,b:2,c:3} 
 
    }, 
 
    { 
 
     child_obj: {a:4,b:5,c:6}, 
 
     child_obj2: {a:7,b:8,c:9} 
 
    } 
 
]; 
 
// specific rewrite of your code would be 
 
myarray.forEach(obj => Object.values(obj.child_obj).forEach(value => { 
 
    console.log(value); 
 
})); 
 

 
console.log('-------'); 
 
// other examples 
 
myarray.forEach(obj => Object.values(obj).forEach(value => { 
 
    // do things with each "child object" 
 
    console.log(value); 
 
})); 
 

 
myarray.forEach(obj => Object.values(obj).forEach(child => Object.values(child).forEach(value => { 
 
    // do things with each property in each child object 
 
    console.log(value); 
 
})));

+0

不错,虽然我不确定这对我是否合适。每个对象都有一些属性,其中'child_obj'只是一个(可能应该提到过),并记录它循环的每个属性。此外,如果其中一个第一级别属性具有空值或未定义值,则循环会中断.. – poepje

+0

后面的代码会完成所有操作 –

0

ÿ OU可以在循环使用的forEach用的内部::

myArray.forEach(function(obj){ 
for(var i in obj){ 
// do stuff 
} 
}) 
0

天真递归方法可用于基本类型:

function forEachPrimitive(o, f, k) { if (o !== Object(o)) f(k, o) 
 
            else for (k in o) forEachPrimitive(o[k], f, k) } 
 

 
var obj = [ { x: { a: '0', b: true, c: 2   } }, 
 
      { y: { d: /3/, e: null, f: undefined } } ] 
 

 
forEachPrimitive(obj, console.log)