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

问题描述 投票:1回答:1

我想知道在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()
);

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

javascript functional-programming
1个回答
1
投票

你在想这个。

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

Javascript中的本地状态很好。

这并不是说任何事情都会发生,我不会改变reducer内部的外部数据结构(或任何其他函数中的内容),而是改变那些在调用之外没有“泄漏”以减少并仅为了实例化而实例化的数据结构。以这种方式建造的目的很好。

© www.soinside.com 2019 - 2024. All rights reserved.