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]);
}
}