Array.prototype.map () возвращает пустой элемент, а Array.prototype.forEach () - - PullRequest
0 голосов
/ 18 сентября 2018

Я испытываю странное поведение с .map().Он возвращает пустой элемент, а .forEach() - нет.

Вот код:

class Entry {
    constructor(data) {
        this.name = data[0],
        this.age = data[1],
        this.school = data[2]
    };

    get organised() {
        return this.organise();
    };

    organise() {
        const data = {
            name: this.name,
            school: this.school
        };
        return data;
    }
}

const getDataForEach = (obj) => {
    let r = [];
    obj.forEach((i) => {
        const e = new Entry(i);
        r.push(e.organised);
    });
    return r;
};
getDataForEach(input); // return normal object array [{...}, {...}, ...]

Но если я использую .map(), он возвращает массив объектов с первым элементом:пустой.Другие предметы такие же, как в результате .forEach().

const getDataMap = (obj) => {
    return obj.map((i) => {
        const e = new Entry(i);
        console.log(e) // return normal [{...}]
        console.log(e.organised) // return normal {...}
        return e.organised;
    });
};
getDataMap(input); // return an object array with the first item empty [<1 empty item>, {...}, {...}, ...]

Испытывали ли вы что-нибудь подобное?

1 Ответ

0 голосов
/ 18 сентября 2018

При обработке разреженного массива и map, и forEach() пропускают элементы, которые никогда не были назначены или были удалены.

Разница, однако, заключается в том, что map создает сам результирующий массивв то время как ваш код forEach() помещается в массив результатов.push() никогда не создаст дыр в массиве, так как он всегда добавляет новый элемент с текущей длиной, но map() может. MDN указывает:

Из-за алгоритма, определенного в спецификации, если массив, для которого была вызвана карта, является разреженным, результирующий массив также будет разреженным, оставляя эти индексы пустыми.

Вы получите результат, аналогичный map, если вы измените код forEach, чтобы использовать индексы входного массива вместо использования push, например,

const getDataForEach = (obj) => {
    let r = [];
    obj.forEach((i, index) => {
        const e = new Entry(i);
        r[index] = e.organised;
    });
    return r;
};
...