Todavía soy algo nuevo en JavaScript, Node, etc. y vengo de un fondo Groovy (que tiene una sintaxis extremadamente similar a JavaScript). En Groovy, puedo hacer fácilmente algo como esto:

def myMap1 = {};
def myMap2 = {};

myMap1["key1"] = "value1";
myMap1["key2"] = "value2";
myMap1["key3"] = "value3";

myMap1.each() { key, value =>
    myMap2[key] = value;
}

Esto iteraría a través del mapa existente (myMap1) y copiaría los valores de cada clave al nuevo mapa (myMap2), con los mismos nombres de clave. Muy fácil. Sin embargo, JS tiene un concepto del prototipo, lo que me ha vuelto loco porque tienes que usar hasOwnProperty, el índice del tipo de elemento, etc. y da como resultado una gran cantidad de código para algo que se supone que es realmente simple.

Al observar los documentos de MDN para Object (), parece que JS ha implementado algo que permite a un desarrollador acceder a pares clave / valor sin tener que lidiar con la creación de prototipos y todo eso, y solo puede acceder a los datos en el objeto, y no propiedades del objeto. Ahora tengo esto:

var existingData = {"foo":"thing","bar":"otherThing","baz":"whatever"};
var update = {"foo":"newStuff","bar":"thisChanged","baz":"arghh"};

for (const [ key, value ] of Object.entries(update)) {
    console.log("Old value is " + existingData[key]);
    existingData[key] = value;
    console.log("Setting " + existingData[key] + " to " + value);
}

Creo que esto funcionaría, pero en su lugar lo obtengo en la consola:

Old value is undefined
Setting thing to thing
Old value is undefined
Setting otherThing to otherThing
Old value is undefined
Setting whatever to whatever

Parece que existenteData [clave] no hace referencia a la clave en el par clave / valor, sino al valor o algo así. ¿Cómo le digo, "para este nombre clave en este segundo objeto, establezca este valor?" He estado buscando para siempre en Google y todo lo está haciendo a la antigua usanza (con índices) o es demasiado complicado sin ninguna razón en particular. Cualquier ayuda sería muy apreciada.

2
NellaGnute 16 sep. 2018 a las 21:33

4 respuestas

La mejor respuesta

Podrías hacer esto, recorriendo un conjunto de teclas:

let myMap1 = {};
let myMap2 = {};

myMap1["key1"] = "value1";
myMap1["key2"] = "value2";
myMap1["key3"] = "value3";

// create an array of the keys in the object myMap1
let myMap1_keys = Object.keys(myMap1);

// loop through the array of object keys
for (let i = 0; i < myMap1_keys.length; i++) {
  myMap2[myMap1_keys[i]] = myMap1[myMap1_keys[i]];
}

Aconsejaría no usar un bucle for..in, es decir, como se usa en una de las otras respuestas, ya que son más lentas que un bucle for nativo (como se usó anteriormente). Puede ver algunos detalles sobre el rendimiento aquí: Comparación del rendimiento de los bucles de JavaScript (para, do while, for in)

Si solo está interesado en duplicar literalmente el objeto, puede hacerlo así:

let myMap2 = JSON.parse(JSON.stringify(myMap1));

Otra respuesta sugirió usar Object.assign () y otra sugirió usar operadores de propagación ES6, pero estos copiarán el objeto 'superficialmente', lo que significa que los objetos están usando referencias al objeto original y solo copiarán el nivel superior del objeto - el método anterior copias profundas del objeto que generalmente encuentro es lo que se requiere para la mayoría de los casos de uso y copiará todos los niveles del objeto.

0
Matthew P 16 sep. 2018 a las 19:36
for (let key in map1) {
    map2[key] = map1[key];
}

Por cierto, por qué no usa Object.assign (); ? (aviso: devuelve un nuevo objeto)

let update = { "key1": "value1", "key2": "value2" };
let map2 = Object.assign({}, map1, update);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

4
idmitrov 16 sep. 2018 a las 18:51

Puedes iterar sobre las teclas. comprobar esto es útil para usted

var m1 = {};
let m2 = {};

m1["key1"] = "abc";
m1["key2"] = "def";
m1["key3"] = "ghi";

var m1_change_key = Object.keys(m1);

for (var i = 0; i < m1_change_key.length; i++) {
  m2[m1_change_key[i]] = m1[m1_change_key[i]];
 alert(m2[m1_change_key[i]])
}
0
user6250770 16 sep. 2018 a las 18:45

Simplemente use Object.assign(map2, map1) para actualizar map2 (copie la clave / valor de map1 a map2)

O puedes usar,

map2 = {...map2, ...map1} para construir un nuevo objeto y reemplazar el map2 completamente

Para tener una copia profunda, en lugar de solo el primer nivel, puede usar JSON.parse(JSON.stringify(map2)) en lugar de map2. Si crees que es un objeto grande y que impacta el rendimiento, ¡busca una implementación anidada de la copia de forma recursiva! ;-)

2
Koushik Chatterjee 16 sep. 2018 a las 19:23