浅克隆ES6映射或集


Answers:


202

使用构造函数克隆地图和集合:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)

3
如何做一个深克隆?
条例草案

3
看看这个小提琴,看看如何深度克隆地图:jsfiddle.net/pahund/5qtt2Len/1
Patrick Hund

5
Map应该被视为抽象数据类型,而不是Javascript对象。因此,深度克隆aMap没有任何意义。

5
不幸的是,复制构造函数在IE 11中不起作用(创建了空映射)。
Jan Molnar '18

4

通过for循环创建新Set的速度比Set构造函数快。尽管程度较小,但Maps也是如此。

const timeInLoop = (desc, loopCount, fn) => {
  const d = `${desc}: ${loopCount.toExponential()}`
  console.time(d)
  for (let i = 0; i < loopCount; i++) {
    fn()
  }
  console.timeEnd(d)
}

const set = new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

const setFromForLoop = x => {
  const y = new Set()
  for (const item of x) y.add(item)
  return y
}

const map = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]])

const mapFromForLoop = x => {
  const y = new Map()
  for (const entry of x) y.set(...entry)
  return y
}

timeInLoop('new Set(set)', 1e5, () => new Set(set))

timeInLoop('setFromForLoop(set)', 1e5, () => setFromForLoop(set))

timeInLoop('new Map(map)', 1e5, () => new Map(map))

timeInLoop('mapFromForLoop(map)', 1e5, () => mapFromForLoop(map))


好发现!可能需要在Chromium错误跟踪器上创建一个错误来引起他们的注意。这肯定可以在引擎中修复。对于Firefox而言,情况与此类似Set(尽管并非如此Map)。
Jo Liss
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.