2017-02-14 17 views
2

Я пытаюсь условно добавить свойство к объекту в массиве, используя .map(), но, похоже, что-то не хватает. Мой массив объектов остается неизменным после завершения карты. Все это является результатом попытки разрешить ошибку ESLint «no-param-reassign», если это помогает понять, почему я это делаю.Добавление нового свойства в объект, который существует в массиве, используя .map()

Я сделал рудиментарный пример того, что я пытаюсь сделать здесь: jsfiddle.

var aList = [{ 
    Title: "Enders Game", 
    Rating: 8 
    }, 
    { 
    Title: "Harry Potter", 
    Rating: 10 
    }]; 

console.log('before', aList); 

aList.map(function(book) { 
    if(book.Title == "Enders Game"){ 
    console.log({ ...book, completed: true }) 
    return { ...book, completed: true }; 
    } 
    console.log({ ...book, completed: false }) 
    return { ...book, completed: false }; 
}); 

console.log('after', aList); 
+3

'.map()' не мутировать оригинал. Он создает новый массив, который возвращается, поэтому 'var newMap = aList.map (...' –

ответ

4

Вы можете использовать Array#forEach, потому что вы не используете результат Array#map.

var aList = [{ Title: "Enders Game", Rating: 8 }, { Title: "Harry Potter", Rating: 10 }]; 
 

 
aList.forEach(function(book) { 
 
    book.completed = book.Title == "Enders Game"; 
 
}); 
 

 
console.log(aList);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Для всех новых массива, можно использовать Array#map и использовать результат этого. Чтобы добавить новое свойство к объекту, вы можете использовать Object.assign, который мутирует и возвращает объект по первому параметру.

var aList = [{ Title: "Enders Game", Rating: 8 }, { Title: "Harry Potter", Rating: 10 }], 
 
    newList = aList.map(book => Object.assign({}, book, {completed: book.Title == "Enders Game"})); 
 

 
console.log(aList); 
 
console.log(newList);
.as-console-wrapper { max-height: 100% !important; top: 0; }