javascript - JavaScript 的 FilterWithKeys?

标签 javascript filter functional-programming lodash ramda.js

ramda ,我们有很多高阶组合器来做实际工作。一个非常方便的工具是 .filter() 实用程序 - ES6 中为我们提供了 Array.filter() 函数,但是 ramda(我相信还有 lodash)为我们提供了也能够过滤对象。对我来说,我想要一个工具来同时过滤键和值。

ES6 中的 const 关键字是一个非常强大的工具 - 通过将其与任意(非对象)值一起使用,我们可以保证该值对于 block 的其余部分永远不会改变(并帮助我们推断错误,还有许多其他非常好的收获)。从对象中过滤键和值的唯一其他实用方法是使用 for .. in,这强制您使用可变变量:

let xs = {...}
for (const k in xs) {
  if (someProperty(k,xs[k])) {
    delete xs[k]
  }
}

我认为使用 filterWithKey 可以缓解这个问题:

const xs = filterWithKey(someProperty, {...})

流行的 javascript 库中有类似的东西吗?我还没有在 ramda 或 lodash 中看到类似的东西,我不知道还能去哪里看。我认为这将是一个合适的实现:

function filterWithKey (p,xs) {
  R.toPairs(xs).reduce((acc,x) => {
    const k = x[0]
    const v = x[1]
    return p(k,v) ? acc[k] = v : acc
  })
}

尽管如此,它仍然需要重建对象的行为。有更好的解决办法吗?

最佳答案

Ramda 最近才添加了根据对象值过滤对象的功能;在此之前,它本身就支持列表,否则会委托(delegate)给对象的 filter 方法(如果存在)。但在 Issue 1429它也扩展到普通对象。

该问题中关于支持 keys 参数的可能性进行了大量讨论,但最终证明它与库的其他部分有太多不一致。

我刚刚向 Ramda's Cookbook 添加了一个部分描述自己编写此函数的一种方法:

const filterWithKeys = (pred, obj) => R.pipe(
  R.toPairs, 
  R.filter(R.apply(pred)), 
  R.fromPairs
)(obj);

filterWithKeys(
  (key, val) => key.length === val, 
  {red: 3, blue: 5, green: 5, yellow: 2}
); //=> {red: 3, green: 5}

如果您有更有用的简短示例,我很乐意将其包含在内。

与 Ramda 世界中的任何事物一样,它不会改变您的输入数据。这在函数式编程中非常重要,我对使用以这种方式构建的版本不感兴趣。换句话说,我认为这是一个功能:

It still requires the act of rebuilding the object though.

关于javascript - JavaScript 的 FilterWithKeys?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34830751/

相关文章:

javascript - 使用 angular.js 用最后选择的值填充隐藏字段

functional-programming - F# 扩展欧几里得算法与延续问题

javascript - 这可以重构为使用通用功能原理吗?

haskell - 什么是 super 组合子和常量应用形式?

javascript - 如何在 Element UI Input v2.x 中键入时发出值?

javascript - 过滤掉充满对象的数组?

javascript - 为数组中的每个名称查找 Meteor 中另一个集合中的一些用户数据

filter - 给定帧上的 ffmpeg 抽屉盒

javascript - 将 HTML 字符串发送到服务器,然后我可以使用 DOM 与其交互吗?可以在上面使用 jQuery 吗?

javascript - switch div 函数中 JavaScript 的时间延迟