Javascript 确保生成贴图对象时的不变性

Javascript 确保生成贴图对象时的不变性,javascript,Javascript,我已经阅读了无数关于JS中不变性的文章,但我仍然对下面的代码感到困惑 在循环中使用map.set将项目添加到map对象是正确的,还是使用spread操作符并在每次迭代时将以前的map扩展到新map中以确保不变性是正确的 const list = [ { id: 'dog', label: 'Dog', }, { id: 'cat', label: 'Cat', }, { id: 'horse', label: 'Horse',

我已经阅读了无数关于JS中不变性的文章,但我仍然对下面的代码感到困惑

在循环中使用
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])
);