javascript – 确保生成地图对象时的不变性

我在JS中阅读了无数关于不变性的文章,我仍然对以下代码感到困惑.

在循环中使用map.set以便将项添加到地图对象中是否正确?或者使用扩展运算符并在每次迭代时将前一个映射扩展到新映射以确保不变性是否正确?

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]))
}

选项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])],
  ])
}

最佳答案 在这两个中,map.set()绝对是更好的方法.如果您所针对的环境具有迭代器支持(这也避​​免了不必要的解构),请考虑使用for / of:

const map = new Map();

for (const item of list) {
    map.set(item.id, item);
}

非常明了!您可以创建相同的地图而不会像这样改变它:

const map = new Map(
    list.map(item => [item.id, item])
);

但你应该选择一个你觉得更具可读性的那个,而不是你可以称之为不可变的那个,因为它听起来不错.本地状态是解决问题的一种非常好的方法,特别是在JavaScript之类的语言中,这种语言并非专门设计为功能性的.

点赞