lodash fp并重构一些现有代码

时间:2018-07-18 19:58:11

标签: javascript refactoring lodash

我正在学习函数式编程,并尝试使用lodash FP重构一段旧代码。

这是我的代码:

_.filter(x => isIdInArray(x)(xs))(otherXs)

读起来太复杂了,让我感到有点奇怪(闻到吗?)

我的问题是以这种方式声明了x值,即isIdInArray的第一个参数:

const getId = _.get('id');
const isIdInArray = _.compose(_.includes, getId);

我不能通过这种方式使用lodash过滤器功能:

_.filter(isIdInArray(xs))(otherXs)

我什至不知道这是否可行,但是我很确定自己可以做得更清楚或更可读。

您有什么想法吗?

2 个答案:

答案 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);