Javascript ES6/ES5 найти в массиве и изменить
У меня есть массив объектов. Я хочу найти по какой-то области, а затем изменить ее:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Я хочу, чтобы он изменил исходный объект. Как? (Я не забочусь, будет ли это в lodash тоже)
Ответы
Ответ 1
Вы можете использовать findIndex для поиска индекса в массиве объекта и при необходимости заменить его:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundIndex = items.findIndex(x => x.id == item.id);
items[foundIndex] = item;
Это предполагает уникальные идентификаторы. Если ваши идентификаторы дублируются (как в вашем примере), вероятно, лучше, если вы используете forEach:
items.forEach((element, index) => {
if(element.id === item.id) {
items[index] = item;
}
});
Ответ 2
Мой лучший подход:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
items[items.findIndex(el => el.id === item.id)] = item;
Ссылка для findIndex
И в случае, если вы не хотите заменять новый объект, но вместо этого, чтобы скопировать поля item
, вы можете использовать Object.assign
:
Object.assign(items[items.findIndex(el => el.id === item.id)], item)
как альтернатива с .map()
:
Object.assign(items, items.map(el=> el.id === item.id? item: el))
Ответ 3
Другой подход заключается в использовании сплайсинга.
Метод splice()
изменяет содержимое массива, удаляя или заменяя существующие элементы и/или добавляя новые элементы на месте.
NB. Если вы работаете с реактивными средами, он обновит "представление", ваш массив "зная", что вы его обновили.
Ответ:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
let foundIndex = items.findIndex(element => element.id === item.id)
items.splice(foundIndex, 1, item)
А если вы хотите изменить только значение элемента, вы можете использовать функцию поиска:
// Retrieve item and assign ref to updatedItem
let updatedItem = items.find((element) => { return element.id === item.id })
// Modify object property
updatedItem.aProp = ds.aProp
Ответ 4
Может быть использован фильтр.
const list = [{id:0}, {id:1}, {id:2}];
let listCopy = [...list];
let filteredDataSource = listCopy.filter((item) => {
if (item.id === 1) {
item.id = 12345;
}
return item;
});
console.log(filteredDataSource);
Array [Object {id: 0}, Object {id: 12345}, Object {id: 2}]
Ответ 5
vvvfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff