Clonar superficialmente un mapa o conjunto ES6

99

¿Cómo se hace una clonación superficial de un objeto de conjunto o mapa ES6 ?

Quiero obtener un nuevo mapa o conjunto que tenga las mismas claves y valores.

Jo Liss
fuente

Respuestas:

203

Utilice el constructor para clonar mapas y conjuntos:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
Jo Liss
fuente
3
¿Cómo hacer un clon profundo?
BILL
3
Echa un vistazo a este violín para ver cómo clonar en profundidad un mapa: jsfiddle.net/pahund/5qtt2Len/1
Patrick Hund
5
Mapdebe tratarse como un tipo de datos abstracto, no como un objeto Javascript. Por lo tanto, la clonación profunda a Mapno tiene sentido.
5
Desafortunadamente, el constructor de copias no funciona en IE 11 (se crea un mapa vacío).
Jan Molnar
5

Crear un nuevo Set a través de un bucle for es más rápido que el constructor Set. Lo mismo ocurre con Maps, aunque en menor grado.

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
fuente
¡Buen hallazgo! Podría valer la pena crear un error en el rastreador de errores de Chromium para llamar su atención. Esto seguramente se puede arreglar en el motor. De manera similar para Firefox, que presenta el mismo problema para Set(aunque no para Map).
Jo Liss