【问题标题】:Is there a way to change an item in an array of objects without changing its position?有没有办法在不改变其位置的情况下更改对象数组中的项目?
【发布时间】:2019-08-28 04:43:13
【问题描述】:

我正在修改一个对象数组。我想改变一个项目的价值。 为此,我创建了一个新对象,旧对象更改了一些值。 之后我删除数组中的旧对象,然后再连接新对象..

我有我所期望的,但项目的位置也发生了变化(结束)。

如何在不更改位置的情况下更改项目?

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;

【问题讨论】:

    标签: javascript react-native redux react-redux


    【解决方案1】:

    如果您要替换一个项目,您可以使用map 而不是filter

    nextState = {...state};
    nextState.basketOfMedicines = nextState.basketOfMedicines.map(entry => entry == action.value ? newMedoc : entry);
    

    【讨论】:

      【解决方案2】:

      仅当您的应用程序中的位置有意义时,否则没有。但是您已经更改了方法中的当前状态,您不应该这样做。您应该克隆阵列,例如使用 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 的使用只是举例,可能还有其他很酷的库。或者你自己写一个克隆方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-28
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 2019-10-26
        相关资源
        最近更新 更多