2017-09-13 13 views
0

私は、配列内のトラフの2次元オブジェクトをループしています。私は現在、これを次のように実行します。配列内のオブジェクトをループする

私の配列は、この

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

状の第2レベルのオブジェクトを通じて、この

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

そしてIループのように見えるので、それがループ内のループです。それはうまく動作しますが、それは非常にきれいに見えないし、私はこれを行うために良い(と短い)方法かもしれないと感じる。 私がこれをやっているのは、すべてchild_objで何かする必要があるからです。

言及する価値

  • for().map()などが適切にそれを扱うことはできませんが、これは、オブジェクトをループできますので、私はjQuery.each()を使用しています。
  • 配列またはその内容の構造を変更できません
  • インデックス(args iおよびj)を使用する必要はありません。

良い方法はありますか?

+0

Array.prototype.forEach() – user7951676

+0

@ user7951676これを使って第2レベルのオブジェクトを取得する方法を説明できますか? – 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]; 
    } 
} 

が、ここであなたは、元のVARSを反復しているとして、あなたは直接それらの値を変更することができます。アンダー-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のを捨てる(そしてそれが.eachに低速だ)と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'はちょうど1つ(おそらくそれを述べておくべきです)であり、ループする各属性を記録します。さらに、これらの第1レベルの属性のいずれかがnullまたは未定義の値を持つ場合、ループは壊れます。 – poepje

+0

後者のコードはすべてそれを行います –

0

Y

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

ナイーブな再帰的なアプローチは、プリミティブ型のために使用することができるの内側:: OUは、ループ内のためにはforEachを使用することができます。

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)

関連する問題