Перебор массива в js, интересный трабл

279
05 ноября 2017, 19:56

Имеется массив вида:

    a[1]['foo'] = 1;
    a[2]['bar'] = 2;

Метод forEach отлично работает с этим массивом

    a.forEach(function(value){
        console.log(value)
    })

но если у массива строковые индексы:

    a['foo']['foo'] = 1;
    a['bar']['bar'] = 2;

тогда метод forEach не выдаёт результат.

Возможно, кто то сталкивался уже с этим, и знает как лечить ?

Answer 1

Да вроде и не должно. forEach итерирует числовые индексы.

Хотите прогонять строковые ключи, используйте обычный for:

for (var key in a) {
    console.log(a[key]);
}
Answer 2

Всё в javascript суть объекты, даже массивы.
Массив - это упорядоченный набор данных, индексирующийся от 0...

let a = [1, 2, 3]; // Массив чисел
let b = [{v: 1}, {v: 2}, {v: 3}]; // Массив объектов
let c = {one: 1, two: 2, three: 3}; // объект

Метод forEach является методом массивов (Array.prototype.forEach) и реализован примерно так:

Array.prototype.forEach = function(callback){
  for (let i = 0; i < this.length; ++i) callback(this[i], i, this);
}

Он ничего не знает про свойства, которые вы добавили в массив, как в объект.

Чтобы проитерировать подобные свойства, можете воспользоваться циклом for .. in:

for (let i in obj) {
  if (!obj.hasOwnProperty(i)) continue;
  // ...
}
READ ALSO
Как заменить forEach() на map()?

Как заменить forEach() на map()?

Помогите пожалуйста переписать кусочек кода:

230
Принять JSON на стороне JS

Принять JSON на стороне JS

Добрый деньВозникла такая проблема

250