Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “替代方案”;for loop";用于检查相应的ID';s_Javascript_Arrays_Reactjs_React Native - Fatal编程技术网

Javascript “替代方案”;for loop";用于检查相应的ID';s

Javascript “替代方案”;for loop";用于检查相应的ID';s,javascript,arrays,reactjs,react-native,Javascript,Arrays,Reactjs,React Native,我有一个products数组——一个包含一系列产品对象的数组——我还有一个subscriptionItems数组——其中包含用户添加到购物车中的所有项目。两个数组都使用useState 我的函数addItem从产品数组中获取一个对象,并将其添加到subscriptionItems数组。但是,如果添加的产品已在subscriptionItems数组中,则不会再次添加该项,但会根据第二条if语句增加产品对象的数量 const [products, setProducts] = useState(da

我有一个
products数组
——一个包含一系列产品对象的数组——我还有一个
subscriptionItems数组
——其中包含用户添加到购物车中的所有项目。两个数组都使用useState

我的函数
addItem
产品数组
中获取一个对象,并将其添加到
subscriptionItems数组
。但是,如果添加的产品已在
subscriptionItems数组中,则不会再次添加该项,但会根据第二条if语句增加产品对象的数量

const [products, setProducts] = useState(data);
const [subscriptionItems, setSubscriptionItems] = useState(initialSubscriptionProducts)

const addItem = (itemId) => {
    let len = products.length;
    for (let i = 0; i < len; i++) {
      if (products[i].id === itemId) {
        let lenSub = subscriptionItems.length;
        for (let j = 0; j < lenSub; j++) {
          if (subscriptionItems[j].id === itemId) {
            setSubscriptionItems(
              (subscriptionItems[j].amount = subscriptionItems[j].amount + 1)
            );
          } else {
            setSubscriptionItems((prevArray) => [...prevArray, products[i]]);
          }
        }
      }
    }
  };
const[products,setProducts]=useState(数据);
常量[subscriptionItems,setSubscriptionItems]=useState(initialSubscriptionProducts)
常量附加项=(项ID)=>{
设len=乘积。长度;
for(设i=0;i[…prevArray,产品[i]]);
}
}
}
}
};

问题在于,在for循环完成时,产品将被添加,而当初始
subscriptionItems
数组为空时,产品将被添加。我只想添加或增加产品一次,但我真的不知道其他方法可以做到这一点。任何帮助都将不胜感激。

您可以这样做。创建一个helper函数,该函数将告诉您给定的产品是否在
subscriptionItems
数组中,并返回其索引(如果存在)

const productIndex = (itemID) => {
   for (let i = 0; i < subscriptionItems.length; i++) {
      if (subscriptionItems[i].id === itemID) {
         return i;
      }
   }
   return null;
}

现在,逻辑被分离,代码不会不必要地重复。

将订阅逻辑放在单独的函数中。我想你会发现这会使逻辑更容易理解。现在我明白了Robert Harvey的意思,这段代码更简洁,谢谢你的洞察力。但是,我在运行ProductIndex函数时遇到了一个错误,它说“undefined不是对象,正在计算subscriptionItems[I].id”,我猜在循环通过空数组时会发生这种情况。我在Product Index函数的第二行中添加了“if(subscriptionItems[I]!=undefined){…}”,但当在subscriptionItems数组中添加产品时,它会将“undefined”添加为数组项。您可能对如何初始化
产品和
subscriptionItems
有问题。如果
subscriptionItems
被初始化为
[]
,则
productIndex
将不会引发此类错误。尝试使用一些
console.log
s查看问题所在。
const getProductByID = (itemID) => {
   for (let i = 0; i <= products.length; i ++) {
      if (product.id === itemID) {
         return product;
      }
   }
}
const addItem = (itemID) => {
   const index = productIndex(itemID);
   if (index) {
      setSubscriptionItems(
         (subscriptionItems[index].amount = subscriptionItems[index].amount + 1)
      );
   } else {
      const product = getProductByID(itemID);
      setSubscriptionItems((prevArray) => [...prevArray, product]);
   }
}