Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript的带键过滤器?_Javascript_Filter_Functional Programming_Lodash_Ramda.js - Fatal编程技术网

Javascript的带键过滤器?

Javascript的带键过滤器?,javascript,filter,functional-programming,lodash,ramda.js,Javascript,Filter,Functional Programming,Lodash,Ramda.js,在中,我们得到了许多高阶组合子来做实际工作。一个非常方便的工具是.filter()实用程序-我们在ES6中获得了Array.filter()函数,但是ramda(我相信还有lodash)也给了我们过滤对象的能力。对我来说,我想要一个工具来同时过滤键和值 ES6中的const关键字是一个非常强大的工具-通过将它与任意(非对象)值一起使用,我们可以保证该值在块的其余部分永远不会改变(并帮助我们推断bug,以及许多其他非常好的收益)。从对象中筛选关键帧和值的唯一其他实用方法是使用for。。在中,强制您

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

ES6中的
const
关键字是一个非常强大的工具-通过将它与任意(非对象)值一起使用,我们可以保证该值在块的其余部分永远不会改变(并帮助我们推断bug,以及许多其他非常好的收益)。从对象中筛选关键帧和值的唯一其他实用方法是使用
for。。在
中,强制您使用可变变量:

let xs = {...}
for (const k in xs) {
  if (someProperty(k,xs[k])) {
    delete xs[k]
  }
}
我认为使用带键的过滤器可以缓解这个问题:

const xs = filterWithKey(someProperty, {...})
在流行的javascript库中有类似的东西吗?我还没有在拉姆达或洛达斯看到过类似的东西,我不知道还能去哪里看。不过,我认为这是一个合适的实施方案:

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
  })
}

尽管如此,它仍然需要重建对象。有更好的解决方案吗?

拉姆达最近才增加了根据对象值过滤对象的功能;在此之前,它本机支持列表,如果对象存在,它将委托给对象的
filter
方法。但实际上,它也扩展到了普通物体

关于支持
参数的可能性,在该问题上进行了大量讨论,但最终证明它与库的其他部分存在太多的分歧

我刚刚添加了一节来描述为自己编写此函数的一种方法:

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世界中的任何东西一样,它不会改变您的输入数据。这在函数式编程中非常重要,我对使用这种方式构建的版本不感兴趣。换句话说,我认为这是一个特点:

尽管如此,它仍然需要重建对象


如果你问是否有适合对象的过滤函数的实现,可能没有,大多数这样的方法都会返回一个新对象,出于显而易见的原因,我正在尝试看看这个设计中是否还有更多的优化可供使用-我不确定,尽管显然用
const
声明一个值为对象的变量不会阻止其属性被修改。密封或冻结物体。