Lodash forEach Associative Array

try*_*sis 8 javascript arrays foreach node.js lodash

关联数组是否有forEach循环Lodash?我发现,名为 "forEach" 的函数仅适用于索引数组.例如,如果我有一个myArray包含值的数组[1, 2, 3],那么

lodash.forEach(myArray, function(index) {
    console.log(index);
});
Run Code Online (Sandbox Code Playgroud)

并运行函数(in Node),我得到预期的结果:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用关联数组时,它不起作用:

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

正如您在运行此操作时所看到的Node,即使回调函数包含除数组元素之外的其他内容,它也不会触发.它似乎完全跳过循环.

首先,为什么会发生这种情况?第二,是否有另一个功能包括在Lodash这个问题中,或者,如果没有,有没有办法使用该forEach功能来完成这个,而不改变过程中的原始数组?

try*_*sis 6

Lodash具有此功能forOwn.在第二个数组中,如果你这样做

_.forOwn(myArray, function(index) {
    console.log(index);
});
Run Code Online (Sandbox Code Playgroud)

你应该得到预期的结果.

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


Joh*_*olu 6

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

关联数组只是一组键值对,它只是一个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); 
});
Run Code Online (Sandbox Code Playgroud)

要不就

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

   lodash.forIn(myArray, function(value, key) {
        console.log(key + " : " + value); 
    });
Run Code Online (Sandbox Code Playgroud)

这里有关于Object as Associative Array的更多信息