每个关联arrays的Lodash

在关联数组中有一个forEach循环在Lodash中吗? 我发现, 称为 “forEach”的函数仅适用于索引数组。 例如,如果我有一个数组myArray与值[1, 2, 3] ,并做

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

并运行该function(在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看到的那样,即使它包含了除数组元素以外的东西,callback函数也不会被触发。 它似乎完全跳过循环。

首先,为什么会这样呢? 其次, Lodash是否还有另外一个函数来处理这个问题,或者,如果没有的话,有没有办法使用forEach函数来完成这个任务,而不需要改变stream程中的原始数组呢?

 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); }); 

更多关于对象作为关联数组在这里

Lodash具有用于此目的的function。 在第二个数组中,如果你这样做

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

你应该得到预期的结果。

我仍然不确定为什么forEach似乎跳过了第一个函数,但是我相信它可能与没有“长度”的数组有关。 JavaScript数组的长度是它所具有的最高编号索引。 例如,定义为myOtherArray[999]="myValue"的数组myOtherArray的长度将为1,000(因为数组是零索引的,意味着它们从0开始,而不是从1开始),即使它没有其他值。 这意味着一个没有编号索引或只有负索引的数组将不具有length属性。 Lodash必须在这一点上采取行动,而不是给数组一个length属性,可能会保持一致性和性能,从而不呈现任何输出。