通过初始化循环访问数组中元素的属性来创建计数对象

Making a count object by initializing properties from iterating through elements in an array

本文关键字:属性 创建 对象 元素 初始化 循环 访问 数组      更新时间:2023-09-26

好吧,所以我正在研究javascript-koans的最后一个问题。我得到的代码和数据集如下:

products = [
   { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false },
   { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false },
   { name: "South Of The Border", ingredients: ["black beans", "jalapenos", "mushrooms"], containsNuts: false },
   { name: "Blue Moon", ingredients: ["blue cheese", "garlic", "walnuts"], containsNuts: true },
   { name: "Taste Of Athens", ingredients: ["spinach", "kalamata olives", "sesame seeds"], containsNuts: true }
];
it("should count the ingredient occurrence (imperative)", function () {
  var ingredientCount = { "{ingredient name}": 0 };
    for (i = 0; i < products.length; i+=1) {
      for (j = 0; j < products[i].ingredients.length; j+=1) {
        ingredientCount[products[i].ingredients[j]] = (ingredientCount[products[i].ingredients[j]] || 0) + 1;
      }
    }
  expect(ingredientCount['mushrooms']).toBe();
});

我想我理解了一些正在发生的事情:我们正在遍历产品数组以循环访问每个产品的成分数组,获取成分,并使用括号表示法将其作为 intriientCount 对象的属性调用。但是在这里,我失去了它,因为然后我们将其设置为等于自身或零,然后无论如何添加一个。有人可以纠正我在那里的错误并解释我错过了什么吗?在括号表示法中用"蘑菇"调用成分计数变量如何/在哪里在此表达式中建立"蘑菇"?我们如何在不显式引用 ingtriientCount 的 {ingredient name} 属性的情况下递增它?是否有某种隐式分配或正在发生什么?

此外,测试运行程序返回一个错误,让我知道预期结果应该是 2。

我想通了。我对代码的书面总结是正确的,除了我们在此代码中看到的不仅仅是一个表达式,更重要的是它是一个变量赋值。因此,在每次迭代每个产品的每种成分时,我们都在 intriientCount 对象中初始化一个新属性,并将其设置为等于自身或零。但为什么要这样做呢?因为如果你将一个不存在的对象的属性设置为等于它自己,你就会得到未定义——它不会初始化。幸运的是,undefined 是一个假值,因此如果该属性不存在,则通过设置为零来初始化它,然后递增到 1。之后,每个现有成分的每个额外计数都采用真实的数值(跳过 or 后面的零(并添加一个。因此,当我们从控制台查看结果时,我们看到 intriientCount 对象的行为不像一个函数(因为我在认为它时很困惑(,相反,它是一个简单的对象,具有我们可以访问的属性,为我们提供单独的计数:

[object Object] {
  artichoke: 1,
  black beans: 1,
  blue cheese: 1,
  garlic: 1,
  goats cheese: 1,
  jalapenos: 1,
  kalamata olives: 1,
  mushrooms: 2,
  roma: 1,
  rosemary: 1,
  sesame seeds: 1,
  spinach: 1,
  sundried tomatoes: 2,
  walnuts: 1
  {ingredient name}: 0
}

{成分名称}只是在代码中作为占位符,这就是为什么它显示在底部的原因。