Lodash для каждого ассоциативного массива

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

Подробнее об объекте как ассоциативном массиве здесь