Javascript 使用redux基于当前值更新对象数组中的单个对象属性

Javascript 使用redux基于当前值更新对象数组中的单个对象属性,javascript,redux,immutability,Javascript,Redux,Immutability,在我的状态中,我有一个对象数组,该数组具有一些描述性属性、数量和唯一id。此对象中的数据来自API响应,在我的动作创建者中,我检查状态以查看它是否已经存在,如果已经存在,则为我的减速机发送增量动作。这就是我的action creator的外观: export const getProductDetails = upc => (dispatch, getState) => { const state = getState(); const products = state.table.

在我的状态中,我有一个对象数组,该数组具有一些描述性属性、数量和唯一id。此对象中的数据来自API响应,在我的动作创建者中,我检查状态以查看它是否已经存在,如果已经存在,则为我的减速机发送增量动作。这就是我的action creator的外观:

export const getProductDetails = upc => (dispatch, getState) => {
const state = getState();
const products = state.table.products;
if (_find(products, upc) !== undefined) {
  dispatch({ type: INCREMENT_QUANTITY, payload: upc });
} else {
axios
  .post(<--POST TO ENDPOINT-->) }
  })
  .then(res => {
    dispatch({ type: POST_UPC, payload: res.data });
  })
  .catch(err => {
    errorHandler(dispatch, err.response, AUTH_ERROR);
  });
 }
};
我基于这个逻辑
,但由于某些原因,在调度操作时,重复产品将被覆盖为
null
,而不是按预期增加数量。我现在还在努力学习redux,请原谅我的无知。理想情况下,我希望避免仅仅为了增值而引入库或包。我的reducer中到底缺少了什么?

您在
映射
回调中没有返回任何内容,您正在创建一个块,因此无法获得预期的结果。相反,省略括号
{…}

products: state.products.map(product => 
  action.payload === product.upc
    ? { ...product, quantity: product.quantity + 1 }
    : product;
);

这将使用箭头函数语法隐式返回三元运算符的结果。

如果在
映射
回调中没有返回任何内容,则创建的是块,因此无法获得预期的结果。相反,省略括号
{…}

products: state.products.map(product => 
  action.payload === product.upc
    ? { ...product, quantity: product.quantity + 1 }
    : product;
);

这将使用箭头函数语法隐式返回三元运算符的结果。

Perfect!我知道我在地图功能中遗漏了一些小东西。因此,现在数组中的对象不会变成
null
,但是数量字段在多个已调度调用中保持静态,以增加该字段。还有什么我遗漏的吗?@ChristianTodd也许你的意思是
action.payload.upc
?你能提供派遣的行动吗?我更新了我的原始问题,以包含我的整个行动的创建者。“希望这会更清楚。”ChristianTodd说,这可能超出了最初问题的范围。也许问一个新的问题和所有的细节会得到新鲜的眼睛和准确的答案。完美!我知道我在地图功能中遗漏了一些小东西。因此,现在数组中的对象不会变成
null
,但是数量字段在多个已调度调用中保持静态,以增加该字段。还有什么我遗漏的吗?@ChristianTodd也许你的意思是
action.payload.upc
?你能提供派遣的行动吗?我更新了我的原始问题,以包含我的整个行动的创建者。“希望这会更清楚。”ChristianTodd说,这可能超出了最初问题的范围。也许问一个新的问题和所有的细节将得到新的眼睛和准确的答案。