为了账号安全,请及时绑定邮箱和手机立即绑定

for循环逻辑无法检测数组中是否存在项目(javascript)

for循环逻辑无法检测数组中是否存在项目(javascript)

红糖糍粑 2022-10-13 19:27:35
我正在检查内存中是否已经存在产品 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        }            }}
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

我认为问题可能出在您的 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 })

    }

}

对于第一个产品,它将设置 found 等于 true,对于第二次迭代,它将进入 else 并将 found 设置为 false。我想也许正因为如此,你得到了一个重复的产品。代替 for 循环来检查元素是否存在,您可以使用数组的 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/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex


查看完整回答
反对 回复 2022-10-13
?
慕沐林林

TA贡献2016条经验 获得超9个赞

我不熟悉反应,但通常像这样的一行:for (let x in products),将带回 x 的产品,而不是索引。您将 x 视为索引。这是问题的一部分吗?



查看完整回答
反对 回复 2022-10-13
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信