我要检查内存中是否已经存在产品ID,所以我只更新它的数量,我的数据是一个数组,看起来像 [{ id: data.id, price: data.price, qty: 1 }]
我的代码是这个功能
storeProduct = async (data) => {
this.setState({ found: null })
try {
const value = await AsyncStorage.getItem('cart')
if (value !== null) {
var products = JSON.parse(value)
for (let x in products) {
if (products[x].id === data.id) {
this.setState({ found: true })
} else {
this.setState({ found: false })
}
}
} else {
await AsyncStorage.setItem(
'cart',
JSON.stringify([{ id: data.id, price: data.price, qty: 1 }])
)
}
if (this.state.found === false) {
var obj = { id: data.id, price: data.price, qty: 1 }
await AsyncStorage.setItem('cart', JSON.stringify([...JSON.parse(value), obj]))
}
} catch (error) {
this.setState({ error: error })
}
}
它确实起作用,但仅当在同一产品上进行测试时,当我单击另一种产品然后返回到第一个产品时,它将该ID连接到数组,然后得到2个相似的ID。这很奇怪,所以我不确定应该使用哪种逻辑,下面的示例使用redux启发了我:
if(action.type === ADD_TO_CART){
let addedItem = state.items.find(item=> item.id === action.id)
//check if the action id exists in the addedItems
let existed_item= state.addedItems.find(item=> action.id === item.id)
if(existed_item)
{
addedItem.quantity += 1
return{
...state,
total: state.total + addedItem.price
}
}
else{
addedItem.quantity = 1;
//calculating the total
let newTotal = state.total + addedItem.price
return{
...state,
addedItems: [...state.addedItems, addedItem],
total : newTotal
}
}
}
我认为问题可能出在您的for循环内,它已针对多个项目执行。例如 -
let products = [{ id: "id", price: "price", qty: 1 },{ id: "id2", price: "price2", qty: 12 }]
for (let x in products) {
if (products[x].id === data.id) {
this.setState({ found: true })
} else {
this.setState({ found: false })
}
}
对于第一个乘积,它将set found等于true,并且对于第二次迭代,它将进入else并将set found等于false。我认为也许正因为如此,您获得了重复的产品。代替for循环检查元素是否存在,可以使用array的findIndex方法-
let index = products.findIndex((element)=> element.id === data.id)
if(index !== -1)
{
this.setState({ found: true })
}else{
this.setState({ found: false })
}
findindex的参考-https: //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句