web-dev-qa-db-ja.com

Lodash forEach Associative Array

連想配列のforEachLodashループはありますか?関数called "forEach"は、インデックス付き配列に対してのみ機能します。たとえば、値が[1, 2, 3]の配列myArrayがある場合、

lodash.forEach(myArray, function(index) {
    console.log(index);
});

関数(Node内)を実行すると、期待どおりの結果が得られます。

1
2
3

ただし、これを連想配列で試してみると、機能しません。

lodash = require('lodash');
myArray = [];
myArray['valOne'] = 1;
myArray['valTwo'] = 2;
myArray['valThree'] = 3;
lodash.forEach(myArray, function(index) {
    console.log('7');
});

これをNodeで実行するとわかるように、配列要素以外のものが含まれている場合でも、コールバック関数は起動しません。ループを完全にスキップしているようです。

まず第一に、なぜこれが起こるのですか?次に、この問題のためにLodashに含まれている別の関数がありますか、そうでない場合は、forEach関数を使用して、元の配列を変更せずにこれを実行する方法があります。処理する?

8
trysis

Lodashには、この目的のための関数forOwnがあります。 2番目の配列では、

_.forOwn(myArray, function(index) {
    console.log(index);
});

意図した結果が得られるはずです。

forEachが最初の関数をスキップしているように見える理由はまだわかりませんが、「長さ」を持たない配列に関係している可能性があると思います。 JavaScript配列の長さは、配列が持つ最大の番号付きインデックスです。たとえば、myOtherArray[999]="myValue"として定義された配列myOtherArrayは、他の値がない場合でも、長さが1,000になります(配列はゼロインデックスであるため、1ではなく0から始まります)。これは、番号付きインデックスがない、または負のインデックスのみを持つ配列には、length属性がないことを意味します。 Lodashはこれを取得し、配列にlength属性を与えないようにする必要があります。これにより、一貫性とパフォーマンスが維持され、出力がレンダリングされない可能性があります。

5
trysis
myArray = [];
myArray['valOne'] = 1;
myArray['valTwo'] = 2;
myArray['valThree'] = 3;
lodash.forEach(myArray, function(index) {
    console.log('7');
});

連想配列は、キーと値のペアのセットであり、Javascriptオブジェクトにすぎません。上記の場合-myArray.length === 0、実際の配列に値を追加するのではなく、配列オブジェクトにプロパティを追加するだけです。

代わりに、このようにmyArrayを初期化し、forInを使用してループします。

var myArray = {};
myArray['valOne'] = 1;
myArray['valTwo'] = 2;
myArray['valThree'] = 3;

lodash.forIn(myArray, function(value, key) {
    console.log(key + " : " + value); 
});

あるいは単に

   var  myArray = {
    valOne  : 1,
    valTwo  : 2,
    valThree : 3
   };

   lodash.forIn(myArray, function(value, key) {
        console.log(key + " : " + value); 
    });

連想配列としてのオブジェクトの詳細 ここ

6