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

我正在检查内存中是否已经存在产品 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

        }

        

    }

}


红糖糍粑
浏览 104回答 2
2回答

慕桂英3389331

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

慕沐林林

我不熟悉反应,但通常像这样的一行:for (let x in products),将带回 x 的产品,而不是索引。您将 x 视为索引。这是问题的一部分吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript