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.

Jawaban:


203

Gunakan konstruktor untuk mengkloning Maps dan Set:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.