仅更改一个javascript映射的一个实例

时间:2018-07-28 12:31:45

标签: javascript dictionary ecmascript-6

只是想知道什么是最好的方法。我设置了一个JavaScript地图。然后将地图实例分配给一个对象。但是,当我更改对象的实例之一时,它将更改地图的其他实例。因此,如果您运行下面的代码,您会发现对于所有感冒实例,温度已更改为10,而对于最后一个实例,温度应该这样做。

我在下面放了一个可运行的代码段。我也有一个小提琴 https://jsfiddle.net/bupLsf9n/ (我认为阅读小提琴上的console.log会更容易)

var myMap = new Map([
  ["hot", { temperature: 100 }],
  ["warm", { temperature: 50 }],
  ["cold", { temperature: 0 }],
]);

var data = [
  { id: 1, map: myMap.get("hot") },
  { id: 2, map: myMap.get("warm") },
  { id: 3, map: myMap.get("cold") },
  { id: 4, map: myMap.get("hot") },
];
$(document).ready(function() {
  data.filter(x => x.id == 4)[0].map.temperature = 10;
  console.log(data);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

1 个答案:

答案 0 :(得分:3)

如果您希望data [x] .map成为Map的不同实例,那么最终可以这样做,但是我不确定那是您想要的:

var myMap = () => new Map([
  ['hot', {
    'temperature': 100
  }],
  ['warm', {
    'temperature': 50
  }],
  ['cold', {
    'temperature': 0
  }],
]);

var data = [{
    id: 1,
    map: myMap().get('hot')
  },
  {
    id: 2,
    map: myMap().get('warm')
  },
  {
    id: 3,
    map: myMap().get('cold')
  },
  {
    id: 4,
    map: myMap().get('hot')
  },
]
$(document).ready(function() {
  data.filter(x => x.id == 4)[0].map.temperature = 10;
  console.log(data[0]);
  console.log(data[3]);
  //data[0].map != data[3].map
});

-

var myMap = () => new Map()

此行返回一个函数,该函数创建Map的新实例,这就是为什么您必须在数据数组map : myMap()中像这样调用它以获取每个条目的新实例的原因

编辑:

如果要复制特定值而不是Map的新实例,则可以保留var myMap = new Map([...])声明,并为每个条目执行此操作:

  var data = [{
    id: 1,
    map: Object.assign({}, myMap.get('hot'))
  }, //etc...
  ]

但是就像@Pointy在评论中说的那样,这只会复制对象的浅层副本,希望对您有所帮助