ES6マップまたはセットのシャロークローン


99

ES6 MapまたはSetオブジェクトをどのようにシャロークローンしますか?

同じキーと値を持つ新しいマップまたはセットを取得したい。

回答:


202

コンストラクターを使用して、マップとセットのクローンを作成します。

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)

3
ディープクローンを作成するにはどうすればよいですか?
2016

3
マップをディープクローンする方法については、このフィドルを確認してください:jsfiddle.net/pahund/5qtt2Len/1
Patrick Hund

5
MapJavascriptオブジェクトとしてではなく、抽象データ型として扱う必要があります。したがって、ディープクローニングはMap意味がありません。

5
残念ながら、コピーコンストラクターはIE 11では機能しません(空のマップが作成されます)。
JanMolnar18年

4

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


素敵な発見!Chromiumバグトラッカーでバグを作成して、注意を喚起する価値があるかもしれません。これは確かにエンジンで修正可能です。Firefoxの場合も同様で、Set(ではありませんがMap)同じ問題が発生します。
Jo Liss
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.