更新 reducer 中对象数组中的对象 属性 - Redux
Update object property in array of objetcs in reducer - Redux
大家好,我正在努力寻找最佳方法来更新对象数组中对象的 属性 值,而不改变我的 reducer 中的数组。
这是我的减速器文件:
const initialState = {
products:[]
};
export default function basketReducer(state = initialState, action){
switch (action.type) {
case "ADD_PRODUCT_TO_BASKET":
return state
case "REMOVE_PRODUCT_FROM_BASKET":
return state
default:
return state
}
};
这是产品对象的示例:
{
id: 1,
name: "product 1",
quantity: 1,
price: 1.0,
}
当我添加一个已经在我的数组中的产品(相同的 id)时,我想将他的数量 属性 增加一个。
我已经有了检查该项目是否已存在于我的数组中的功能,我只是在寻找一种方法来更新数量 属性 而不改变数组。
感谢您的帮助!
更新:
根据@Will Jenkins 的回答,我写了这段代码:
case "ADD_PRODUCT_TO_BASKET": {
const index = state.products.findIndex(p => p.id === action.payload.id);
if(index !== -1){
const productId = action.payload.id
return {...state, products: state.products.map(p => p.id === productId ? {...p, quantity:p.quantity+1} : p)}
}else {
return {products: [...state.products].concat(action.payload)};
}
}
这很好用,当我添加一个新产品时,它会附加到数组中,如果我添加相同的产品,他的数量会增加一个,但我很确定我可以重构这段代码,有人有吗一个提议?
假设您将产品 ID 作为您操作的负载传递,映射您的产品并增加与该 ID 匹配的产品的数量:
case "ADD_PRODUCT_TO_BASKET": {
const productId = payload
return {...state, products: state.products.map(p => p.id === productId ? {...p, quantity:p.quantity+1} : p)}
}
更新
我会选择更长的形式,这样其他人(或未来的你)更容易理解和维护:
case "ADD_PRODUCT_TO_BASKET": {
const addedProduct = action.payload;
const productId = addedProduct.id;
const exists = state.products.some((p) => p.id === productId);
if (exists) {
const products = state.products.map((p) =>
p.id === productId ? { ...p, quantity: p.quantity + 1 } : p
);
return { ...state, products };
} else {
return {
...state,
products: [...state.products, { ...addedProduct }]
};
}
}
我建议不要直接改变数组,而是复制它,映射数组,然后更改所需对象的 属性。不直接改变会省去很多麻烦,而且通常是一种更好的代码编写方式。
幸运的是,map函数并没有直接变异returns一个新的数组。
const newArr = arr.map(product => product.id === id ? {...product, product.quantity += 1} : product);
大家好,我正在努力寻找最佳方法来更新对象数组中对象的 属性 值,而不改变我的 reducer 中的数组。
这是我的减速器文件:
const initialState = {
products:[]
};
export default function basketReducer(state = initialState, action){
switch (action.type) {
case "ADD_PRODUCT_TO_BASKET":
return state
case "REMOVE_PRODUCT_FROM_BASKET":
return state
default:
return state
}
};
这是产品对象的示例:
{
id: 1,
name: "product 1",
quantity: 1,
price: 1.0,
}
当我添加一个已经在我的数组中的产品(相同的 id)时,我想将他的数量 属性 增加一个。 我已经有了检查该项目是否已存在于我的数组中的功能,我只是在寻找一种方法来更新数量 属性 而不改变数组。
感谢您的帮助!
更新: 根据@Will Jenkins 的回答,我写了这段代码:
case "ADD_PRODUCT_TO_BASKET": {
const index = state.products.findIndex(p => p.id === action.payload.id);
if(index !== -1){
const productId = action.payload.id
return {...state, products: state.products.map(p => p.id === productId ? {...p, quantity:p.quantity+1} : p)}
}else {
return {products: [...state.products].concat(action.payload)};
}
}
这很好用,当我添加一个新产品时,它会附加到数组中,如果我添加相同的产品,他的数量会增加一个,但我很确定我可以重构这段代码,有人有吗一个提议?
假设您将产品 ID 作为您操作的负载传递,映射您的产品并增加与该 ID 匹配的产品的数量:
case "ADD_PRODUCT_TO_BASKET": {
const productId = payload
return {...state, products: state.products.map(p => p.id === productId ? {...p, quantity:p.quantity+1} : p)}
}
更新
我会选择更长的形式,这样其他人(或未来的你)更容易理解和维护:
case "ADD_PRODUCT_TO_BASKET": {
const addedProduct = action.payload;
const productId = addedProduct.id;
const exists = state.products.some((p) => p.id === productId);
if (exists) {
const products = state.products.map((p) =>
p.id === productId ? { ...p, quantity: p.quantity + 1 } : p
);
return { ...state, products };
} else {
return {
...state,
products: [...state.products, { ...addedProduct }]
};
}
}
我建议不要直接改变数组,而是复制它,映射数组,然后更改所需对象的 属性。不直接改变会省去很多麻烦,而且通常是一种更好的代码编写方式。
幸运的是,map函数并没有直接变异returns一个新的数组。
const newArr = arr.map(product => product.id === id ? {...product, product.quantity += 1} : product);