Javascript 的 FilterWithKeys?
FilterWithKeys for Javascript?
在ramda中,我们给出了很多高阶组合子来做实际工作。一个非常方便的工具是 .filter()
实用程序——我们在 ES6 中获得了 Array.filter()
函数,但是 ramda(我相信还有 lodash)也让我们能够过滤对象。对我来说,我想要一个工具来同时过滤 键和值。
ES6 中的 const
关键字是一个非常强大的工具 - 通过将它与任意(非对象)值一起使用,我们可以保证该值在块的其余部分永远不会改变(并帮助我们推断错误,还有很多其他非常好的收获)。从对象中过滤键和值的唯一其他实用方法是使用 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 最近才添加了根据值过滤对象的功能;在那之前它原生支持列表,否则会委托给对象的 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.
在ramda中,我们给出了很多高阶组合子来做实际工作。一个非常方便的工具是 .filter()
实用程序——我们在 ES6 中获得了 Array.filter()
函数,但是 ramda(我相信还有 lodash)也让我们能够过滤对象。对我来说,我想要一个工具来同时过滤 键和值。
ES6 中的 const
关键字是一个非常强大的工具 - 通过将它与任意(非对象)值一起使用,我们可以保证该值在块的其余部分永远不会改变(并帮助我们推断错误,还有很多其他非常好的收获)。从对象中过滤键和值的唯一其他实用方法是使用 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 最近才添加了根据值过滤对象的功能;在那之前它原生支持列表,否则会委托给对象的 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.