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

时间:2018-10-15 01:54:20

标签: 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])],
  ])
}

1 个答案:

答案 0 :(得分:1)

在这两个中,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这样的语言中,该语言并非专门为功能而设计的。