我想更好地学习JS。
我有以下代码,我试图将其放入underscore.js但是失败了。
我希望你能指出我哪里出错了。
我正在尝试采用我知道可行的循环,然后使用下划线功能来优化它。顶部测试显示循环,第二个测试是我尝试使用underscore.js。我悲惨地失败了!
由于
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(2);
});
it("should count the ingredient occurrence (functional)", function () {
var ingredientCount = { "{ingredient name}": 0 };
var ffd = _(products).chain()
.map(function(x){return x.ingredients;})
.flatten()
.reduce(function(memo,x){
if (x===memo)
{
return ingredientCount[memo] = ingredientCount[memo]+1;
}
else
{
return ingredientCount[memo] = 0;
}
})
.value();
/* chain() together map(), flatten() and reduce() */
expect(ingredientCount['mushrooms']).toBe(2);
});
答案 0 :(得分:3)
你的减少功能不是很好。看看它的documentation! “备忘录”,也称为“累加器”,是从上一次迭代返回的值 - 应该是您的ingredientCount
地图。
var ingredientCount = _.chain(products)
.pluck("ingredients") // don't use map for that
.flatten()
.reduce(function (memo, item) {
memo[item] = (memo[item] || 0)+1;
/* alternative:
if (item in memo)
memo[item]++;
else
memo[item] = 1;
*/
return memo; // to be used in the next iteration!
}, {/*"{ingredient name}": 0*/})
.value();
请注意memo === ingredientCount
!
答案 1 :(得分:0)
我会使用更简单的方法来理解代码,尽管它不起作用:
it("should count the ingredient occurrence (functional)", function () {
var ingredientCount = { "{ingredient name}": 0 };
var dummy = _(products).chain()
.pluck("ingredients")
.flatten()
.each(function(x) { ingredientCount[x] = (ingredientCount[x] || 0) + 1; })
.value();
expect(ingredientCount['mushrooms']).toBe(2);
});