0

私がデータを扱っているとき、私は通常、作成する ArraysObjectsループする必要があります。たとえば、「その場で」としましょう。

たとえば、配列キーの 1 つで要素をグループ化する配列を再配置したいとします。私が使用する方法の 1 つは、for in. しかし問題は、その場で複数のインデックスを定義する場合です。

for(key in array){
   newArray[array[key]['gouping_key']] = array[key];
}

この例は正常に動作します。ただし、同じ を持つ要素が複数ある場合grouping_key、このコードは前の要素をオーバーライドします。

だから、私はこれを試します:

var i = 0;
for(key in array){
   newArray[array[key]['gouping_key']][i] = array[key];
   i++
}

しかし、その 2 番目のインデックスを追加すると、インタープリターは が であると不平を言いnewArray[array[key]['gouping_key']]ますundefined。前の例では問題がないようです。

何故ですか?

前のスニペットの説明が不十分で不明確な場合に備えて、このフィドルを例で作成しました。フィドルには 3 つのスニペットがあります (2 つはコメントアウトされています)。

1 つ目は、前述のようなことをしようとしたときに発生するエラーです。2番目は私が使用するソリューションです。3 つ目は、インデックスが 1 つだけのオンザフライで配列を作成する例です。

要約すると、2番目のインデックスを追加すると、そのエラーが発生する理由を知りたいです。

ありがとう!

4

2 に答える 2

3
var i = 0;
for(key in array){

   // If nested object doesn't exist, make an empty one.
   newArray[array[key]['gouping_key']][i] =
     newArray[array[key]['gouping_key']][i] || [];

   newArray[array[key]['gouping_key']][i] = array[key];
   i++
}

プッシュ先の配列を作成する必要がありますが、それはあなたのために作成されたものではありません。演算子を使用し||て空の配列を作成できるのは、それがundefined.

また、それは従わなければならないネストがたくさんあります... もし私ができるなら...

var x, y;
y = 0;
for(key in array){
   x = array[key].gouping_key;
   newArray[x][y] = newArray[x][y] || []
   newArray[x][y] = array[key];
   y++
}

それがどれほど読みやすいかがわかりますか?それも速いです!複雑なオブジェクトを何度も深くトラバースする必要はありません。

于 2013-01-21T19:40:09.837 に答える
0

最初に for in for array を使用するのは良い考えではありません。それはあなたが期待しているものではありません。https://stackoverflow.com/a/4261096/1924298を参照してください。単純な for ループ (または while) を使用すると、問題が解決するはずです。

于 2013-01-21T19:43:15.767 に答える