Есть ли способ изменить элемент в массиве объектов без изменения его позиции? - PullRequest
3 голосов
/ 06 апреля 2019

Я изменяю массив объектов. И я хочу изменить стоимость предмета. Для этого я создаю новый объект, старый с некоторыми значениями изменился. После этого я удаляю старый объект в массиве, прежде чем конкатать новый ..

У меня есть то, что я ожидал, но изменилась и позиция предмета (конец).

Как я могу изменить предмет, не меняя позиции?

let newMedoc = {};
newMedoc.quantite = newQuantite;
newMedoc.sub_total = price;
newMedoc.nom = action.value.nom;
newMedoc.prix = action.value.prix;
newMedoc.id = action.value.id;
//Delete the item in the array
nextState = {
  ...state,
  basketOfMedicines: state.basketOfMedicines.filter(index => index !== action.value)
}
//concat a new item in the array
nextState = {
  ...nextState,
  basketOfMedicines: [...nextState.basketOfMedicines, newMedoc]
}
return nextState || state;

Ответы [ 2 ]

4 голосов
/ 06 апреля 2019

Если вы заменяете предмет, вы можете использовать map вместо filter:

nextState = {...state};
nextState.basketOfMedicines = nextState.basketOfMedicines.map(entry => entry == action.value ? newMedoc : entry);
1 голос
/ 06 апреля 2019

Только если позиция в вашем приложении имеет значение, иначе нет.Но вы изменили текущее состояние в вашем методе, и вы не должны этого делать.Вы должны клонировать массив, например, с помощью lodash cloneDeep или чего-то в этом роде.

Ваш newState.basketOfMedicine = state.basketOfMedicine.filter (... содержит только ссылки на объекты. Посмотрите код ниже дляпояснение:

let oldState = [{a:100,b:200},{a:1000,b:2000},{a:10,b:20},{a:1,b:2},];

let arr = oldState.filter(elem => elem.a < 10); // [{a:1,b:2}]
let newState = [...arr] // destructuring
newState[0].a=50 // mutate
console.log(newState[0] === oldState[3]); // true 

Здесь из оригинальной документации lodash:

var objects = [{ 'a': 1 }, { 'b': 2 }];

var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false

Использование lodash ist только для примера, могут быть и другие интересные библиотеки. Или вы пишете метод клонированиясамостоятельно.

...