Javascript 使用每个内部过滤器

Javascript 使用每个内部过滤器,javascript,arrays,functional-programming,underscore.js,Javascript,Arrays,Functional Programming,Underscore.js,我正在研究javascript koans,这是关于使用WhatwehaveLearning.js的第一个挑战。我们的目标是从功能上编写代码——给出了一个必要的答案——删除没有蘑菇和坚果的产品,将它们推送到一个新数组,并获得该数组的长度。以下是我正在使用的数据集: products = [ { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false }

我正在研究javascript koans,这是关于使用WhatwehaveLearning.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 }
];
以下是挑战的指导:

使用filter()和all()/any()进行求解

我坚持使用每个内部过滤器(推、长度等不是问题)。我能够过滤出没有坚果的条目,并使用each(all的别名),使用每个产品的索引搜索每个产品的成分数组,如果数组包含“蘑菇”,则返回true/false。但是,我想使用过滤器的每个内部,所以我不必使用循环。这是我想到的,但它不会返回任何条目:

_.filter(products, function(product) { 
  if(_.every(product.ingredients, function(ingredient) {ingredient !== "mushrooms"})){
    return product;
  }
})

我想做的事可能吗?非常感谢您的指导。

您的问题是在
中没有“return”。每个
函数

对于您提供的代码段,这似乎应该可以做到:

_.filter(products, function(product) { 
   return product.ingredients.indexOf('mushrooms') === -1;
});
就整个问题而言,请尝试以下方法:

_.filter(products, function(product) {
   return _.every(product.ingredients, function(ingredient) {
     if (/nut|mushroom/.test(ingredient) {
        altArray.push(ingredient);
        return false;
     }
     return true;
   });
});

假设您既要创建一个已删除元素的数组版本,也要创建另一个已删除元素的数组版本,我们可以定义一个
分区
函数,该函数通常基于一个过滤函数来执行此操作。看

对于filter函数,实际上并不需要
每一个
。只需检查每个元素的成分列表是否不包含蘑菇,以及
containsNuts
属性是否为false:

function filter(product) {
   return !product.containsNuts && !product.ingredients.contains('mushrooms');
}
现在你可以做了

partition(products, filter)

它将返回一个数组,其第一个元素是传递元素的数组(没有蘑菇的元素等),第二个元素是失败元素的数组。

altArray在这里做什么呢?对于问题的这一部分:“移除没有蘑菇和坚果的产品,将它们推到一个新数组”哈,我错过了部分数据。请参阅@torazaburo的答案以获得更好的实现。谢谢大家。我感谢你的帮助。它是有效的,现在我要看一下这个,直到我真正理解它。
partition(products, filter)