我有一个简单的算法问题,但找不到合适的解决方案。有一个数组,如果recipe_id
的属性在数组中任何对象的recipe_id
属性值中都不相同,我只想在数组中添加一个项目。
我想阻止添加具有相同属性值的任何项目。如果该属性的值不同,则可以。因此,配方数组中的所有对象应具有不同的recipe_id
值。我写了这些代码,但似乎无法正常工作
这是JSBin链接:link
const Recipes =[
{recipe_id:4},
{recipe_id:5}
]
onClickedHandler = (recipe_id) => {
const favData = {
recipe_id: recipe_id,
}
if (Recipes.length > 0) {
for (let item in Recipes) {
if (Recipes[item].recipe_id !== recipe_id) {
console.log("added in the loop!")
Recipes.push(item)
} else {
console.log("it is already in the Recipe list!")
}
}
} else {
console.log("Recipes is empty")
Recipes.push({recipe_id:recipe_id})
}
}
onClickedHandler(9)
console.log(Recipes.length)
答案 0 :(得分:2)
使用Array.some方法检查ID是否存在于数组中。 您可能需要类似的东西:
const Recipes =[
{recipe_id:4},
{recipe_id:5}
];
function addRecipe(recipeId) {
if(!Recipes.some(item => item.recipe_id === recipeId)) {
Recipes.push({recipe_id:recipeId});
console.log("Not duplicate, inserted");
} else {
console.log("duplicate");
}
}
addRecipe(4);
addRecipe(6);
console.log(Recipes)
答案 1 :(得分:0)
问题在于您要遍历元素,添加ID为4的元素时,第一项就是该ID的项。
不通过,下一次迭代,它再次检查具有不同ID的元素。它通过并转到ID。
您需要一个循环,例如try .filter函数,如果返回未定义,则可以添加它,否则请不要添加。
答案 2 :(得分:0)
好吧,只要找到另一个具有不同ID的对象,而不是在添加之前先检查所有对象,就可以使用新配方推送对象。
如果您尝试在所有代码之后添加另一个ID为7(onClickedHandler(7))的对象,则最终将得到3个ID为7的不同对象
答案 3 :(得分:0)
发生这种情况是因为您没有返回for
循环。当然,它将迭代所有项目,并且对于每个具有不同recipe_id
的项目,它将附加一个新项目。一旦发现配方已经存在,就应该跳出功能:
for (let item in Recipes) { // Iterate over each item (no need to test length)
if (Recipes[item].recipe_id !== recipe_id) { // Break if recipe already there.
console.log("it is already in the Recipe list!");
return;
}
}
// Otherwise, it is safe to append the recipe_id:
Recipes.push({recipe_id:recipe_id});
console.log("added in the loop!");
现在,当您找到相同的recipe_id
时,您将从函数中退出。