Klonen Sie eine ES6-Karte oder ein ES6-Set flach

95

Wie klonen Sie ein ES6 Map- oder Set- Objekt flach ?

Ich möchte eine neue Karte oder ein neues Set mit denselben Schlüsseln und Werten erhalten.

Jo Liss
quelle

Antworten:

193

Verwenden Sie den Konstruktor, um Maps und Sets zu klonen:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
Jo Liss
quelle
3
Wie mache ich einen tiefen Klon?
Rechnung
3
Schauen Sie sich diese Geige an, um zu sehen, wie man eine Karte tief klont
Patrick Hund
5
Mapsollte als abstrakter Datentyp behandelt werden, nicht als Javascript-Objekt. Daher macht tiefes Klonen a Mapkeinen Sinn.
4
Leider funktioniert der Kopierkonstruktor in IE 11 nicht (leere Karte wird erstellt).
Jan Molnar
1

Das Erstellen eines neuen Sets über eine for-Schleife ist schneller als der Set-Konstruktor. Gleiches gilt für Karten, wenn auch in geringerem Maße.

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
quelle
Schöner Fund! Es könnte sich lohnen, einen Fehler im Chromium-Bug-Tracker zu erstellen, um die Aufmerksamkeit darauf zu lenken. Dies kann sicher im Motor behoben werden. Ähnliches gilt für Firefox, das das gleiche Problem für Set(wenn auch nicht für Map) aufweist.
Jo Liss