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