【问题标题】:Filter with 'or' in lodash shorthand expression在 lodash 速记表达式中使用“或”过滤
【发布时间】:2016-05-23 12:27:08
【问题描述】:

假设我有一个收藏:

var collection = [{type: 'a'}, {type: 'b'}, {type: 'c'}, {type: 'd'}]

如何过滤它,以便只保留类型“a”和“b”?我希望这样做:

_filter(collection, ['type', 'a', 'b'])

即使用 _.matchesProperty iteratee 速记来处理多种匹配类型,但它不起作用。您是否知道任何简单的方法来实现这一点,而无需定义自定义函数?

【问题讨论】:

  • 不创建自己的函数有什么重要的? collection = _.filter(collection, function(e) { return e.type == 'a' || e.type == 'b' }); 完成。 ES2015 更好:collection = _.filter(collection, e => e.type == 'a' || e.type == 'b');
  • 这不是一个拦截器,但我很惊讶它不被支持,并且做了一些研究没有发现任何东西,所以想确认这在 lodash 中实际上是不可能的。另外,我正在使用更实用的做事方式,所以我希望有人会想出一个有趣的使用 _property、_.partial 或类似的东西。但你说得完全正确,这可以通过自定义函数轻松完成,甚至在 ES6 中以优雅的方式完成。
  • 可以考虑使用conforms(),其中type属性使用includes,即binds['a', 'b']作为其第一个参数。
  • 正是我正在寻找的,只是在您的建议中添加了答案。谢谢一百万!
  • @ryeballar:听起来这会是一个很好的答案。

标签: javascript functional-programming underscore.js filtering lodash


【解决方案1】:

您可以将_.filter 与函数一起使用以使其更实用,但简单的.filter 也足够了:

ES5:

collection.filter(function (i) {
  return i.type === 'a' || i.type === 'b';
});

ES6

collection.filter(i => i.type === 'a' || i.type === 'b')

【讨论】:

  • 谢谢@naomik。我认为,当您对 stackoverflow 投反对票时,应该询问一个原因。我不明白为什么人们在不了解问题/解决方案的情况下投反对票
  • 我没有否决这个问题,但我认为它被否决了,因为我在我的问题中特别排除了这个解决方案:“没有定义自定义函数”
  • @user633183 我可能知道为什么会投反对票,原因有很多: 1. 问题用 lodash 标记,而这个答案没有使用 lodash 的过滤器。 2. Lodash主要用于跨浏览器兼容。过滤器与 IE11 不兼容。 3. OP 在评论中表示,他想确认是否可以在 lodash 中使用 or 进行过滤。我喜欢这个答案,但在 SO 中,我们的目标应该是根据问题提供的上下文提供好的答案,否则,它可能无法满足 OP 的需求。
【解决方案2】:

太好了,将 ryeballar 的建议纳入答案:

假设我有一个:

var collection = [{type: 'a'}, {type: 'b'}, {type: 'c'}, {type: 'd'}]

下面将只过滤掉 'a' 和 'b' 类型:

_.filter(collection, _.conforms({'type': _.partial(_.includes, ['a', 'b'])}))

不是最漂亮的代码,但我认为胜过 ES5 函数并展示了 _.conforms 的工作原理。正是我想要的!

【讨论】:

  • “不是最漂亮的代码,但我认为胜过 ES5 功能……” 嗯……我猜是情人之眼。我更多宁愿看到一个简单的filter 电话。
  • 嗯,你可能是对的,但这仍然是一个有趣的谜题。 :)
  • 你说“速记表达式”和“ES5 函数”之类的东西,好像它们有任何意义......
【解决方案3】:
collection.filter(i => ['a', 'b'].includes(i.type)); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多