#javascript #arrays #reactjs #object
#javascript #массивы #reactjs #объект
Вопрос:
Мне нужно добавить объект к последнему объекту массива
У меня есть массив, который содержит объекты в состоянии класса
state={
items:[{key:"333",val:"Hi"},{key:"555", val:"Iam"}]
}
Мне нужно добавить объект фильтра к последнему объекту item
items:[{key:"333",val:"Hi"},{key:"555", val:"Iam",filter:{refine:true}}]
Я попробовал следующий
(this.state.items.length-1).concat({filters:{
refine:true
}}
Комментарии:
1. Что вы пробовали? Это кажется довольно простой задачей. Получите последний элемент из массива, а затем добавьте к нему
filter
ключ.2. Как насчет того, чтобы
ARRAY[ARRAY.length-1]
получить доступ к lastitem
изarray
?3. «Я попробовал следующий» — Похоже, вам следует еще раз взглянуть на руководство по JavaScript о том, как работать с массивами .
4. «который находится в состоянии» … итак, вы хотите сделать это неизменяемым способом?
5. Я предполагаю, что это связано с состоянием React
Ответ №1:
Вы могли бы просто получить доступ к последнему объекту, используя index
метод array, изменить его и обновить массив состояний
let state={
items:[{key:"333",val:"Hi"},{key:"555", val:"Iam"}]
}
let last = state.items[state.items.length - 1];
last = {...last, filter:{refine:true}};
const newState = {
...state,
items: [
...state.items.slice(0, -1),
last
]
}
console.log(newState);
Комментарии:
1. Просто предложение. Вместо
state.items[state.items.length - 1];
вы можете попробоватьstate.items.pop()
. Это избавляет вас от повторного нарезания. Кроме того, да, это приведет к изменениюstate.items
, но вы в любом случае устанавливаете новое состояние, поэтому не должно иметь такого большого влияния
Ответ №2:
С помощью нескольких небольших помощников….
const lens = (key, fn) => obj => ({ ...obj, [key]: fn(obj[key]) });
const mapIndex = (index, fn) => arr => arr.map((it, i) => i === (index arr.length) % arr.length ? fn(it) : it);
это так просто, как:
this.setState(lens("items", mapIndex(-1, it => ({ ...it, filter: { refine: true }}))));
Ответ №3:
Вы можете взять последний элемент и затем объединить obj с ним, а затем снова добавить его в конец массива
let state={items:[{key:"333",val:"Hi"},{key:"555", val:"Iam"}]}
let obj = {filter:{refine:true}}
let add = (initial,obj) => {
let last = initial[initial.length-1]
let arr = [...initial].slice(0,-2)
return [...initial, {...last, ...obj}]
}
state.items = add(state.items,obj)
console.log(state)