Dangkal-mengkloning Peta atau Set ES6

99

Bagaimana Anda mengkloning objek ES6 Map atau Set ?

Saya ingin mendapatkan Peta atau Kumpulan baru yang memiliki kunci dan nilai yang sama.

Jo Liss
sumber

Jawaban:

203

Gunakan konstruktor untuk mengkloning Maps dan Set:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
Jo Liss
sumber
3
Bagaimana cara melakukan klon yang dalam?
BILL
3
Lihat biola ini untuk melihat cara mengkloning peta secara mendalam: jsfiddle.net/pahund/5qtt2Len/1
Patrick Hund
5
Mapharus diperlakukan sebagai tipe data abstrak, bukan sebagai objek Javascript. Karenanya kloning yang dalam Maptidak masuk akal.
5
Sayangnya konstruktor salinan tidak berfungsi di IE 11 (peta kosong dibuat).
Jan Molnar
5

Membuat Set baru melalui perulangan for lebih cepat daripada konstruktor Set. Hal yang sama berlaku untuk Maps, meskipun pada tingkat yang lebih rendah.

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

richytong
sumber
Temuan bagus! Mungkin ada baiknya membuat bug di pelacak bug Chromium untuk menarik perhatian mereka. Ini pasti bisa diperbaiki di mesin. Demikian pula untuk Firefox, yang menunjukkan masalah yang sama untuk Set(meskipun tidak untuk Map).
Jo Liss