通过初始化循环访问数组中元素的属性来创建计数对象
Making a count object by initializing properties from iterating through elements in an array
好吧,所以我正在研究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
}
{成分名称}只是在代码中作为占位符,这就是为什么它显示在底部的原因。
- 使用导航属性创建Kendo UI网格模型的问题
- Reactjs基于jsx中的属性创建条件组件
- JQuery 从类选择器上的数据属性创建一个数组
- 基于对象属性创建数组
- 融合图表 - 如何获取使用链接属性创建的更新融合图表 json
- 从 ASP.NET Web 窗体中的服务器端属性创建 JavaScript 条件
- 如何从子对象属性创建新数组
- 按属性创建唯一对象的数组
- 使用DOM中定义的html5数据属性创建新元素
- 使用JavaScript中的过滤元素属性创建对象
- 使用现有对象属性创建javascript对象
- 如何为Object.define()定义的属性创建唯一的toJSON方法
- 使用innerHTML属性创建页面加载计数器
- 根据指定的数据属性创建一个包含值和文本的select下拉选项
- 使用其他对象的属性创建对象
- 作为类的函数-为私有属性创建getter和setter
- 当鼠标悬停在由相同数据条目的不同属性创建的圆形元素时,我如何显示/隐藏文本元素?
- jQuery用动态ID和定义的CSS属性创建DIV(定义该DIV的外观和位置)
- 如何在ECMAScript 5: Object中配置属性.创建或定义对象属性
- 附加一个作为对象属性创建的元素