Необходимо добавить объект в массив, который находится в состоянии

#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] получить доступ к last item из 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)