Javascript 确保生成贴图对象时的不变性
我已经阅读了无数关于JS中不变性的文章,但我仍然对下面的代码感到困惑 在循环中使用Javascript 确保生成贴图对象时的不变性,javascript,Javascript,我已经阅读了无数关于JS中不变性的文章,但我仍然对下面的代码感到困惑 在循环中使用map.set将项目添加到map对象是正确的,还是使用spread操作符并在每次迭代时将以前的map扩展到新map中以确保不变性是正确的 const list = [ { id: 'dog', label: 'Dog', }, { id: 'cat', label: 'Cat', }, { id: 'horse', label: 'Horse',
map.set
将项目添加到map对象是正确的,还是使用spread操作符并在每次迭代时将以前的map扩展到新map中以确保不变性是正确的
const list = [
{
id: 'dog',
label: 'Dog',
},
{
id: 'cat',
label: 'Cat',
},
{
id: 'horse',
label: 'Horse',
},
]
const thing = function generateThing(id) {
return {
id,
build() {
return true
},
}
}
const map = new Map()
选项1
for (let i = 0, len = list.length; i < len; i += 1) {
const { id } = list[i]
map.set(id, thing(list[i]))
}
for(设i=0,len=list.length;i
选项2
let map = new Map()
for (let i = 0, len = list.length; i < len; i += 1) {
const { id } = list[i]
map = new Map([
...map,
[id, thing(list[i])],
])
}
let map=new map()
for(设i=0,len=list.length;i
在这两种方法中,map.set()
无疑是更好的方法。如果您的目标环境具有迭代器支持(也避免不必要的破坏),请考虑使用<<代码> /<代码> :
太清楚了!您可以创建相同的贴图,而无需对其进行如下更改:
const map = new Map(
list.map(item => [item.id, item])
);
但是你应该选择一个你觉得更可读的,而不是一个你可以称之为不可变的,因为它听起来不错。局部状态是解决问题的一个非常好的方法,特别是在JavaScript这样的语言中,它不是专门设计用来实现功能的。使用
map.set
;每次插入时复制整个地图效率极低。最近JavaScript中的一些不变性信条真的很愚蠢,所以要小心。(如果您想以不可变的方式编写此文件,无论如何都可以使用list.map
)
const map = new Map(
list.map(item => [item.id, item])
);