#javascript #arrays #node.js #foreach #lodash
#javascript #массивы #node.js #для каждого #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
функцию для достижения этой цели, не изменяя исходный массив в процессе?
Ответ №1:
Lodash
имеет функцию forOwn
для этой цели. Во втором массиве, если вы сделаете
_.forOwn(myArray, function(index) {
console.log(index);
});
вы должны получить желаемый результат.
Однако я все еще не уверен, почему forEach
, похоже, пропускается первая функция, но я считаю, что это может быть связано с тем, что массив не имеет «длины». Длина JavaScript
массива — это самый высокий нумерованный индекс, который он имеет. Например, массив myOtherArray
, определенный как myOtherArray[999]="myValue"
, будет иметь длину 1000 (поскольку массивы индексируются с нулевым индексом, то есть они начинаются с 0, а не с 1), даже если у него нет других значений. Это означает, что массив без нумерованных индексов или только с отрицательными индексами не будет иметь length
атрибута. Lodash
должно быть, он улавливает это и не присваивает массиву length
атрибут, вероятно, для поддержания согласованности и производительности, таким образом, не выводя никаких выходных данных.
Ответ №2:
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);
});
Подробнее об объекте как ассоциативном массиве здесь