OuterArray.indexOf(innerArray) не находит вложенный массив

Рейтинг: 1Ответов: 1Опубликовано: 03.02.2015

Делаю упражнение 3 из главы 5 книги Eloquent javascript. Видимо, что-то путаю в синтаксисе, получаю неожиданный результат.

var centuries = [];
for (person in ancestry) {
    var century = (Math.ceil(ancestry[person]["died"] / 100));
    if (centuries.indexOf(century) ===-1) centuries[century] = [];

    centuries[century].push(ancestry[person]["died"] - ancestry[person]["born"]);

    console.log("age", ancestry[person]["died"] - ancestry[person]["born"]);
    console.log("cent", century);
}

Хочу в результате получить массив массивов с веками и продолжительностями жизни в них:

[18:[75,30,28],19:[67,35,88],20:[45,94,65]]

Почему-то на следующем проходе условие не срабатывает, и внутренний массив затирается пустым, дело видимо в некорректном использовании indexOf в условии? И в итоге получаю массив вида:

[18:[28],19:[88],20:[65]]

Что я делаю не так?

Jsfiddle с исходными данными и полным кодом.

Ответы

▲ 1Принят

Функция indexOf ведет поиск по значениям в массиве, а не по самому индексу в нем, как вы пытаетесь делать. Поэтому у Вас каждый раз условие centuries.indexOf(century) === -1 является верным и массив создается заново, теряя предыдущее значение.

Простой пример на ошибку:

var arr = [];
arr[20] = [];
arr.indexOf(20) === -1 //вернет true

Решается просто: if (centuries[century] === undefined) centuries[century] = [];

jsfiddle