浅克隆ES6地图或集

Jo *_*iss 72 javascript ecmascript-6

你如何浅层克隆ES6 MapSet对象?

我想获得一个具有相同键和值的新Map或Set.

Jo *_*iss 153

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

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
Run Code Online (Sandbox Code Playgroud)

  • `Map`应该被视为抽象数据类型,而不是Javascript对象.因此深度克隆"地图"是没有意义的. (4认同)
  • 不幸的是,复制构造函数在IE 11中不起作用(创建了空映射). (4认同)
  • 看看这个小提琴,看看如何深度克隆地图:https://jsfiddle.net/pahund/5qtt2Len/1/ (3认同)
  • 如何做一个深克隆? (2认同)

ric*_*ong 9

通过 for 循环创建新 Set 比 Set 构造函数更快。地图也是如此,尽管程度较轻。

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))
Run Code Online (Sandbox Code Playgroud)

  • 对于年轻的开发人员来说,这是有趣但危险的信息。除非你现在绝对必须拥有最快的时间,否则你最好使用构造函数方法,因为正如 @JoLiss 指出的那样,这是一个错误并且会得到修复 - 这是别人的问题,所以你可以编写的代码越少越好! (5认同)
  • 不错的发现!也许值得在 Chromium 错误跟踪器上创建一个错误来引起他们的注意。这肯定可以在引擎中修复。对于 Firefox 来说也是如此,它对“Set”表现出相同的问题(尽管“Map”没有)。 (4认同)

reb*_*naf 6

浅克隆:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
Run Code Online (Sandbox Code Playgroud)

深度克隆:

var deepClonedMap = new Map(JSON.parse(JSON.stringify([...originalMap])))
var deepClonedSet = new Set(JSON.parse(JSON.stringify([...originalSet])))
Run Code Online (Sandbox Code Playgroud)

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
Run Code Online (Sandbox Code Playgroud)