在Array.prototype.reduce中使用不纯的还原剂是否安全?

时间:2019-04-26 09:03:29

标签: javascript functional-programming

我想知道在JavaScript array.prototype.reduce中使用不纯的还原剂是否安全。

示例:

假设我有以下数组:

[{ id: 0, value: 6 }, { id: 1, value: 25 }]

如果我想将其转换为ID为键,值为值的地图。

我在这里有两个选择:使用纯异径管和不纯异径管。

// pure option
const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }];
const object = data.reduce((accum, { id, value }) =>
  Object.assign({}, accum, { [id]: value }), 
  {}
);
const map = new Map(Object.entries(object));
// impure option
const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }];
const map = data.reduce(
  (accum, { id, value }) => accum.set(id, value),
  new Map()
);

虽然不纯选项的速度更快,样板代码更少,但我不确定它是否安全或是否可以提供比赛条件。

1 个答案:

答案 0 :(得分:1)

您对此有过多的想法。

没关系,我们很多人(包括我自己)在那儿。但是问自己一个问题:从使用地图的实体的角度来看,您能分辨出区别吗?答:不可以。实际上,足够聪明的编译器会将前者变成后者。虽然我通常会在编写代码时尽量避免成为人工编译器,但在这种情况下,不纯版本的较短,而则更快。

Javascript中的

Local 状态为 fine

这并不是说任何事情,我不会在化简器(或其他任何函数)中对外部数据结构进行突变,而是对不会“泄漏”的变量进行突变。在reduce的调用之外,并且仅为了以这种方式构造而进行实例化就可以了。