【问题标题】:Using _.every inside _.filter在 _.filter 中使用 _.every
【发布时间】:2016-05-08 01:04:57
【问题描述】:

我正在研究 javascript-koans,这是 AboutApplyingWhatWeHaveLearnt.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() 解决

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

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

我正在尝试做的事情可能吗?非常感谢任何指导。

【问题讨论】:

    标签: javascript arrays functional-programming underscore.js


    【解决方案1】:

    假设您想要创建一个删除了元素的数组版本,以及另一个删除了元素的数组,我们可以定义一个partition 函数,它通常基于过滤器函数来执行此操作。见this answer

    function partition(arr, filter) {
      var fail = [];
    
      var pass = arr.filter((e, i, a) => {
        if (filter(e, i, a)) return true;
        fail.push(e);
      });
    
      return [pass, fail];
    }
    

    对于过滤器功能,您实际上并不需要every。只需检查每个元素的成分列表不包含蘑菇,并且 containsNuts 属性为 false:

    function filter(product) {
       return !product.containsNuts && !product.ingredients.contains('mushrooms');
    }
    

    现在你可以做

    partition(products, filter)
    

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

    【讨论】:

      【解决方案2】:

      您的问题是_.every 函数中没有“返回”。

      这似乎应该为您提供的 sn-p 解决问题:

      _.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;
         });
      });
      

      【讨论】:

      • altArray 在这里做什么?
      • 对于这部分问题:“去掉没有蘑菇和坚果的产品,将它们推到一个新的数组中”
      • 哈,我错过了数据的 containsNuts 部分。请参阅@torazaburo 的答案以获得更好的实施。
      • 谢谢你们。我很感激帮助。它有效,现在我要研究一下,直到我真正明白为止。
      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2016-06-13
      相关资源
      最近更新 更多