【问题标题】:Making a count object by initializing properties from iterating through elements in an array通过遍历数组中的元素初始化属性来创建计数对象
【发布时间】:2016-02-03 07:04:55
【问题描述】:

好的,所以我正在处理 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();
});

我想我理解了一些正在发生的事情:我们正在遍历 products 数组以遍历每个产品的成分数组,获取一种成分,并使用括号表示法将其作为来自 ingredientsCount 对象的属性进行调用。但是这里是我丢失它的地方,因为然后我们将它设置为等于自身或零,然后不管怎样都加一。有人可以纠正我那里的错误并解释我所缺少的吗?如何/在哪里用括号表示法中的“蘑菇”调用成分计数变量在此表达式中建立“蘑菇”?我们如何在不显式引用的情况下增加成分计数的 {ingredient name} 属性?是否有某种隐式赋值或发生了什么?

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

【问题讨论】:

    标签: javascript properties jasmine variable-assignment


    【解决方案1】:

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

    [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
    }
    

    {ingredient name} 只是在代码中作为占位符,这就是它显示在底部的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多