我一直在研究如何在JavaScript中完成不变性/函数式编程,并且在使用以下代码时遇到了困难。从generateExample
函数返回的对象包含通过迭代对象数组来添加和删除映射中的键/值的方法。
方案1仅使用映射方法set
和delete
并对映射进行突变。方案2在setting
和deleting
键/值之前创建了一个新映射。
我可以在每个set
循环中为每个新的foreach
克隆地图,但是我认为这样做在计算上会太昂贵。
我还可以使用Immutable.js(地图),并为每个set
和delete
返回一个新的数据结构。我真的不想这样做。
在此示例中,从generateExample
返回的对象将是唯一可以set
和delete
到地图的对象,因此也许在这个示例中担心不变性并不是重要吗?
我想了解的是,在设置和删除键/值以及甚至相关时,保持原始地图不变性的最佳方法是什么?
const sampleList = [
{
id: 'dog',
value: 'Dog',
},
{
id: 'cat',
value: 'Cat',
},
]
场景1
const example = function generateExample() {
const container = new Map()
return {
add(list) {
list
.forEach((x) => {
container.set(x.id, x)
})
},
remove(list) {
list
.forEach((x) => {
container.delete(x.id)
})
},
read(id) {
return container.get(id)
},
}
}
场景2
const example = function generateExample() {
let container = new Map()
return {
add(list) {
container = new Map(container)
list
.forEach((x) => {
container.set(x.id, x)
})
},
remove(list) {
container = new Map(container)
list
.forEach((x) => {
container.delete(x.id)
})
},
read(id) {
return container.get(id)
},
}
}
const test = example()
test.add(sampleList)
console.log(test.read('dog'))
答案 0 :(得分:0)
在两种情况下,您都有突变。在第一种情况下,突变是在Map
对象之上,在第二种情况下,突变是在容器值本身之上,然后又在Map
对象上。我建议不要使用这一层,而应处理{ {1}}保持原样,但是如果情况一定是这样,我宁愿做这样的事情
Map