Lodash forEach Associative Array

时间:2014-06-22 07:37:44

标签: javascript arrays node.js foreach lodash

forEach中是否存在关联数组的Lodash循环?我发现,函数名为" forEach"仅适用于索引数组。例如,如果我有一个值为myArray的数组[1, 2, 3],并且执行

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函数来完成此操作,而不更改过程中的原始数组?

2 个答案:

答案 0 :(得分:6)

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

有关对象作为关联数组的更多信息here

答案 1 :(得分:5)

为此,

Lodash具有forOwn函数。在第二个数组中,如果你这样做

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

你应该得到预期的结果。

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