У меня есть массив объектов. Хочу найти по какому-то полю, а потом его изменить:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Я хочу, чтобы он изменил исходный объект. Как? (Мне все равно, будет ли это тоже в lodash)
javascript
arrays
ecmascript-6
lodash
user3712353
источник
источник
item
содержитid
ключ? или вы не против иметь идентификатор, а также все свойстваitem
объекта в записи массива?Ответы:
Вы можете использовать findIndex чтобы найти индекс в массиве объекта и при необходимости заменить его:
Это предполагает уникальные идентификаторы. Если ваши идентификаторы дублируются (как в вашем примере), вероятно, лучше использовать forEach:
источник
let
ключевое слово вместоvar
map
который использует @georg. Чтобы понять, что происходит, требуется меньше умственной гимнастики. Стоит лишняя строка кода.Мой лучший подход:
Ссылка для 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))
Функциональный подход :
Не изменяйте массив, используйте новый, чтобы не создавать побочных эффектов.
источник
try/catch
, но не должны, потому что отсутствие элемента не является исключительным случаем; это стандартный случай, который вы должны учитывать, проверяя возвращаемое значение,findIndex
а затем обновляя массив только тогда, когда элемент был найден.Другой подход - использовать сращивание .
NB: если вы работаете с реактивными фреймворками, он обновит «представление», ваш массив будет «знать», что вы его обновили.
Ответ :
А если вы хотите изменить только значение элемента, вы можете использовать функцию поиска :
источник
Учитывая измененный объект и массив:
Обновите массив новым объектом, перебирая массив:
источник
Можно использовать фильтр .
источник
работал на меня
источник
Хотя большинство существующих ответов прекрасны, я хотел бы включить ответ с использованием традиционного цикла for, который также следует здесь рассмотреть. OP запрашивает ответ, совместимый с ES5 / ES6, и применяется традиционный цикл for :)
Проблема с использованием функций массива в этом сценарии заключается в том, что они не изменяют объекты, но в этом случае изменение является обязательным. Прирост производительности от использования традиционного цикла for - это просто (огромный) бонус.
Хотя я большой поклонник функций массива, не позволяйте им быть единственным инструментом в вашем наборе инструментов. Если целью является изменение массива, они не подходят.
источник
Однострочный с использованием оператора распространения.
источник