添加到数组时检查对象属性-ES6

时间:2018-10-01 14:09:24

标签: javascript arrays

我有一个简单的算法问题,但找不到合适的解决方案。有一个数组,如果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)

4 个答案:

答案 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时,您将从函数中退出。