Как присвоить уникальное значение индекса объектам массива?

Я использую следующую функцию для добавления индекса к каждому объекту массива, но все идентификаторы получают одинаковое значение, когда я проверяю console.log

var foo = [...this.props.articleList];
foo.forEach(function(row, index) {
row.id = index+1;
});
console.log(foo);

Я хочу что-то вроде этого =>

[{…}, {…}, {…}, {…}, id: 1], [{…}, {…}, {…}, {…}, id: 2], [{…}, {…}, {…}, {…}, id: 3]

но он возвращается

[{…}, {…}, {…}, {…}, id: 3], [{…}, {…}, {…}, {…}, id: 3], [{…}, {…}, {…}, {…}, id: 3]

Я предполагаю, что каждый объект в массиве на самом деле является ссылкой на тот же объект в памяти, можете ли вы опубликовать больше кода, чтобы у нас был минимальный воспроизводимый пример?

CertainPerformance 26.10.2018 05:45

на самом деле его данные json поступают из редуктора, я хочу установить только редуктор. в редукторе. вот код редуктора case types.SOMETHING: var foo = [... state.List, action.payload] foo.forEach (function (row, index) {row.index = index + 1;}); return {... state, List: foo}

Ameya Salagre 26.10.2018 05:49
4
2
186
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать array.map следующим образом

var foo = [...this.props.articleList];
foo = foo.map(function(row, index) {
row.id = index+1
return row;
});
console.log(foo);

Попробуй это. Следующие два решения будут работать

     const foo = [...this.props.articleList];
     const articles = foo.map((row, index) => (
             row.id = index+1;
     ));
    console.log(articles);

Или

     const foo = [...this.props.articleList];
     const articles = foo.map((row, index) => {
            return row.id = index+1;
     });
    console.log(articles);
Ответ принят как подходящий

Проблема, по-видимому, связана с обработкой foo и последующим изменением row.id мутационным способом.

Решение состоит в том, чтобы использовать стратегию, обычно называемую клонированием.

Для этого могут быть полезны такие инструменты, как синтаксис распространения и Array.prototype.map ().

См. Практический пример ниже.

case types.SOMETHING: 
    return {...state, List: [...state.List, action.payload].map((row, index) => ({...row, index}))}

Другие вопросы по теме