【发布时间】:2018-04-22 06:52:41
【问题描述】:
我使用 Redux,我经常会使用类似这样的表达式编写 reducer:
return users.map(user =>
user.id !== selectedUserID ? user : {
... user,
removed: false
}
);
意图应该足够清楚:只修改数组中具有给定 id 的项,同时照原样复制其他项。另请注意,排序很重要,否则我只能使用filter() 函数。
这个 sn-p 在 eslint 上触发 no-confusing-arrow 错误,这对我来说很有意义。这也可以通过在箭头函数体周围添加圆括号来轻松解决,所以这里没什么大不了的:
return users.map(user => (
user.id !== selectedUserID ? user : {
... user,
removed: false
}
));
我也想通过prettier解析这段代码,自动去掉箭头函数体周围的括号,回到sn-p的版本1。
这里明显的解决方案是用详细的方式编写箭头函数:
return users.map(user => {
if(user.id !== selectedUserID) {
return user; // unmodified user
}
return {
... user,
removed: false
};
});
但老实说,我觉得它有点太笨拙了。
除了特定的上下文和使用的工具(eslint 和 prettier,可以进行不同的配置/关闭/其他),有没有更好的方法来编写这个?强>
在我最疯狂的梦想中,它存在一个签名类似于:
Array.mapIf(callback, condition)
循环数组中的所有元素,并仅对满足给定condition 的元素调用callback 函数,同时返回未修改的其他元素。
我自己显然可以编写这样的函数,但也许其他函数式语言中已经存在一些值得关注的通用文化/灵感。
【问题讨论】:
-
我认为任何主要语言都没有这样的功能 - 要么是这个,要么我的 Google-fu 没有达到标准。大概是后者。 Clojure 是一种主要的函数式编程语言,该函数不存在。
标签: javascript arrays functional-programming