在设置和删除地图对象时确保原件的不变性

时间:2018-10-17 05:03:03

标签: javascript

我一直在研究如何在JavaScript中完成不变性/函数式编程,并且在使用以下代码时遇到了困难。从generateExample函数返回的对象包含通过迭代对象数组来添加和删除映射中的键/值的方法。

方案1仅使用映射方法setdelete并对映射进行突变。方案2在settingdeleting键/值之前创建了一个新映射。

我可以在每个set循环中为每个新的foreach克隆地图,但是我认为这样做在计算上会太昂贵。

我还可以使用Immutable.js(地图),并为每个setdelete返回一个新的数据结构。我真的不想这样做。

在此示例中,从generateExample返回的对象将是唯一可以setdelete到地图的对象,因此也许在这个示例中担心不变性并不是重要吗?

我想了解的是,在设置和删除键/值以及甚至相关时,保持原始地图不变性的最佳方法是什么?

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'))

1 个答案:

答案 0 :(得分:0)

在两种情况下,您都有突变。在第一种情况下,突变是在Map对象之上,在第二种情况下,突变是在容器值本身之上,然后又在Map对象上。我建议不要使用这一层,而应处理{ {1}}保持原样,但是如果情况一定是这样,我宁愿做这样的事情

Map