Javascript 通过迭代数组中的元素初始化属性来创建count对象

Javascript 通过迭代数组中的元素初始化属性来创建count对象,javascript,properties,jasmine,variable-assignment,Javascript,Properties,Jasmine,Variable Assignment,好的,我正在研究javascript koans的最后一个问题。我给出的代码和数据集如下所示: products = [ { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false }, { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats che

好的,我正在研究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();
});
产品=[
{名称:“Sonoma”,成分:[“洋蓟”、“西红柿干”、“蘑菇”],含香料:假},
{名称:“Pizza Primavera”,配料:[“罗马”、“西红柿干”、“山羊奶酪”、“迷迭香”],含snuts:false},
{名称:“边界以南”,成分:[“黑豆”、“墨西哥胡椒”、“蘑菇”],含鼻烟:假},
{名称:“蓝月亮”,成分:[“蓝奶酪”、“大蒜”、“胡桃”],含鼻烟:真的},
{名称:“雅典的味道”,配料:[“菠菜”、“卡拉玛塔橄榄”、“芝麻籽”],包含香味:真的}
];
它(“应该计算成分的出现(命令)”,函数(){
var IngreditCount={{Component name}:0};
对于(i=0;i
我想我了解了其中的一些情况:我们正在迭代products数组,以迭代每个产品的配料数组,获取配料,并使用括号表示法将其作为IngreditCount对象的属性调用。但在这里,我失去了它,因为我们把它设为等于自身或零,然后不管怎样加上一。有人能纠正我的错误并解释我遗漏了什么吗?使用括号内的“蘑菇”符号调用IngCreditCount变量如何/在何处在此表达式中建立“蘑菇”?我们如何在不显式引用IngreditCount的{Component name}属性的情况下递增它?是否存在某种隐含的赋值或其他情况


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

我找到了答案。我写的代码总结是对的,除了我们在这段代码中看到的不仅仅是一个表达式,更重要的是它是一个变量赋值。因此,在每个产品的每个成分的每次迭代中,我们都会初始化IngreditCount对象中的一个新属性,并将其设置为等于自身或零。但为什么要这样做呢?因为如果你将一个不存在的对象的属性设置为等于它本身,你就会得到未定义的属性——它不会初始化。幸运的是,undefined是一个,因此如果该属性不存在,它将通过设置为零进行初始化,然后递增为1。在这之后,每个现有成分的每个额外计数取真实的数值(跳过or后面的零)并加一。因此,当我们从控制台查看结果时,我们看到ingredientCount对象的行为不像函数(正如我所想的那样),它是一个简单的对象,具有属性,我们可以访问这些属性以获得它们各自的计数:

[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
}
{component name}只是作为占位符出现在代码中,这就是它出现在底部的原因