在ramda中,我们得到了很多高阶组合器来做实际工作。一个非常方便的是.filter()
实用程序——我们Array.filter()
在 ES6 中得到了这个函数,但是 ramda(我相信还有 lodash)也给了我们过滤对象的能力。对我来说,我想要一个工具来同时过滤键和值。
ES6 中的const
关键字是一个非常强大的工具 - 通过将它与任意(非对象)值一起使用,我们可以保证该值在块的其余部分永远不会改变(并帮助我们推断错误,许多其他非常不错的收获)。从对象中过滤键和值的唯一其他实用方法是 using 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
})
}
它仍然需要重建对象的行为。有更好的解决方案吗?