Redux Spread 运算符与 Map

Chr*_*agh 5 javascript dictionary spread reactjs react-redux

我有一个数组中的对象状态(在我的 ReduxReducer 中)。

const initialState = {
      items: [
        { id: 1, dish: "General Chicken", price: 12.1, quantity: 0 },
       { id: 2, dish: "Chicken & Broccoli", price: 10.76, quantity: 0 },
        { id: 3, dish: "Mandaran Combination", price: 15.25, quantity: 0 },
        { id: 4, dish: "Szechuan Chicken", price: 9.5, quantity: 0 }
      ],
      addedItems: [],
     total: 0
    };
Run Code Online (Sandbox Code Playgroud)

我有一个操作,当在 Cart.jsx 中单击按钮时,将对象的数量加 1,例如 {id:1,菜:Generals Chicken,价格:10.76,数量:0}。这是我尝试使用展开运算符的第一个Reducer:

case "ADD_QUANTITY":
  let existing_item = state.addedItems.find(
    item => action.payload === item.id
  );

  return {
    ...state,
    addedItems: [
      ...state.addedItems,
      { ...existing_item, quantity: existing_item.quantity + 1 }
    ]
  };
Run Code Online (Sandbox Code Playgroud)

这不起作用,它没有将数量加 1,而是添加了另一个对象,并将数量设置为 2。.所以,我尝试像这样使用Map

case "ADD_QUANTITY":
  return {
    ...state,
    addedItems: state.addedItems.map(item =>
      item.id === action.payload
        ? { ...item, quantity: item.quantity + 1 }
        : item
    )
  };
Run Code Online (Sandbox Code Playgroud)

这工作正常。我的问题是,为什么展开运算符不起作用?据我所知,它应该做与地图相同的事情?

tri*_*cot 2

当在数组文字上下文中使用扩展语法时,它不会重现键(索引),而只会重现值。与对象文字上下文中的扩展语法相反,后者生成键/值对。后者允许先前的条目被具有相同键的新条目推翻,但第一个条目没有这种行为:它总是传播所有值而不考虑索引。

当替换数组中的元素并复制它时,您需要:

  • 知道应该执行替换的索引,并且
  • 确保副本是 Array 的实例,而不仅仅是普通对象

您可以使用findIndexObject.assign([], )来满足这些需求:

case "ADD_QUANTITY":
  let index = state.addedItems.findIndex(
    item => action.payload === item.id
  );
  existing_item = state.addedItems[index];

  return {
    ...state,
    addedItems: Object.assign([], state.addedItems, {
      [index]: { ...existing_item, quantity: existing_item.quantity + 1 }
    })
  }
Run Code Online (Sandbox Code Playgroud)