連想配列のforEach
にLodash
ループはありますか?関数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
関数を使用して、元の配列を変更せずにこれを実行する方法があります。処理する?
Lodash
には、この目的のための関数forOwn
があります。 2番目の配列では、
_.forOwn(myArray, function(index) {
console.log(index);
});
意図した結果が得られるはずです。
forEach
が最初の関数をスキップしているように見える理由はまだわかりませんが、「長さ」を持たない配列に関係している可能性があると思います。 JavaScript
配列の長さは、配列が持つ最大の番号付きインデックスです。たとえば、myOtherArray[999]="myValue"
として定義された配列myOtherArray
は、他の値がない場合でも、長さが1,000になります(配列はゼロインデックスであるため、1ではなく0から始まります)。これは、番号付きインデックスがない、または負のインデックスのみを持つ配列には、length
属性がないことを意味します。 Lodash
はこれを取得し、配列にlength
属性を与えないようにする必要があります。これにより、一貫性とパフォーマンスが維持され、出力がレンダリングされない可能性があります。
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);
});
連想配列としてのオブジェクトの詳細 ここ