我正在学习函数式编程,并尝试使用lodash FP重构一段旧代码。
这是我的代码:
_.filter(x => isIdInArray(x)(xs))(otherXs)
读起来太复杂了,让我感到有点奇怪(闻到吗?)
我的问题是以这种方式声明了x值,即isIdInArray的第一个参数:
const getId = _.get('id');
const isIdInArray = _.compose(_.includes, getId);
我不能通过这种方式使用lodash过滤器功能:
_.filter(isIdInArray(xs))(otherXs)
我什至不知道这是否可行,但是我很确定自己可以做得更清楚或更可读。
您有什么想法吗?
答案 0 :(得分:3)
尽量不要将lodash给您的所有奇特功能塞进一行。 在一行中拥有一个复杂的机制似乎很好,但是如果您现在仍然无法阅读它,那根本就没有太大帮助。
对于管理集合,我通常使用如下方法:
var collection = [{id: 'a', someField: 1}, {id:'b', someField: 2}];
var theIdsYoureLookingFor = ['a'];
var filtered = collection
.filter(anyObject => _.includes(theIdsYoureLookingFor, anyObject.id))
.map(anyObject => anyObject.someField);
alert(filtered); // alerts 1
解析一组对象,过滤那些具有您认为有效的ID的对象,然后将这些对象映射到某个字段。
也永远不要使用x,xs等变量名
答案 1 :(得分:2)
如果要编写生产代码,建议使用更高级别的函数。在您的特定情况下,我会说您需要_.intersectionBy
:
const keepIfIdInArray = _.intersectionBy('id'); // 'id' can be replaced by your getId
const keepIfIdInOtherXs = keepIfIdInArray(otherXs);
keepIfIdInOtherXs(xs);
如果您是作为练习来执行此操作,那么我想您可能需要分解更多一点。请注意,在lodash / fp中,_.includes
已被管理,因此您应该能够编写以下内容:
const getId = _.get('id');
const isIdInArray = arr => _.compose(_.includes(arr), getId);
const isIdInOtherXs = isIdInArray(otherXs);
_.filter(isIdInOtherXs)(xs);