如何在没有突变的情况下使用 javascript 地图

Ser*_*lov 5 javascript dictionary functional-programming immutability

我正在我的 JS 项目中以函数式方式工作。

这也意味着我不会变异objectarray实体。相反,我总是创建一个新实例并替换旧实例。

例如

let obj = {a: 'aa', b: 'bb'}
obj = {...obj, b: 'some_new_value'}
Run Code Online (Sandbox Code Playgroud)

问题是:

如何使用 javascript 地图以功能性(不可变)方式工作?

我想我可以使用以下代码来添加值:

let map = new Map()
...
map = new Map(map).set(something)
Run Code Online (Sandbox Code Playgroud)

但是删除项目呢?

我不能这样做new Map(map).delete(something),因为 的结果.delete是一个布尔值。

PS我知道 ImmutableJS 的存在,但我不想使用它,因为你永远不能 100% 确定你现在使用的是普通 JS 对象还是 immutablejs 对象(尤其是嵌套结构)。顺便说一句,因为 TypeScript 的支持不好。

Que*_*tin 3

我无法执行 new Map(map).delete(something); ,因为 .delete 的结果是布尔值。

您可以使用间隙变量。如果您愿意,可以将其外包给一个函数:

function map_delete(old_map, key_to_delete) {
    const new_map = new Map(old_map);
    new_map.delete(key_to_delete);
    return new_map;
} 
Run Code Online (Sandbox Code Playgroud)

或者您可以创建获取地图中的条目,过滤它们并根据结果创建一个新条目:

const new_map = new Map( Array.from(old_map.entries).filter( ([key, value]) => key !== something ) );
Run Code Online (Sandbox Code Playgroud)