如何使用 Object() 覆盖 JavaScript 对象值

Nel*_*ute 2 javascript arrays javascript-objects ecmascript-6

我对 JavaScript、Node 等仍然有些陌生,并且来自 Groovy 背景(其语法与 JavaScript 极其相似)。在 Groovy 中,我可以轻松地执行以下操作:

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

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

myMap1.each() { key, value =>
    myMap2[key] = value;
}
Run Code Online (Sandbox Code Playgroud)

这将遍历现有映射 (myMap1) 并将每个键的值复制到新映射 (myMap2),并使用相同的键名。非常简单。然而,JS 有一个原型的概念,这让我很抓狂,因为你必须使用 hasOwnProperty、项目的索引等,这导致了大量代码用于一些本来应该非常简单的事情。

查看 Object() 的 MDN 文档,看起来 JS 已经实现了一些东西,允许开发人员访问键/值对,而无需处理原型设计和所有这些东西,您只需访问对象中的数据,而不是对象的属性。我现在有这个:

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

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

myMap1.each() { key, value =>
    myMap2[key] = value;
}
Run Code Online (Sandbox Code Playgroud)

我认为这会起作用,但我在控制台中得到了这个:

Old value is undefined
Setting thing to thing
Old value is undefined
Setting otherThing to otherThing
Old value is undefined
Setting whatever to whatever
Run Code Online (Sandbox Code Playgroud)

看起来 existingData[key] 没有引用键/值对中的键,而是引用值什么的?我如何告诉它,“对于第二个对象中的这个键名,设置这个值?” 我一直在谷歌上搜索,一切要么以旧方式(使用索引)进行,要么由于没有特别的原因而过于复杂。任何帮助将不胜感激。

Kou*_*jee 7

只需使用即可Object.assign(map2, map1)更新map2(将键/值复制map1map2

或者你可以使用,

map2 = {...map2, ...map1}构建一个新对象并map2完全替换

要获得深层副本,您可以JSON.parse(JSON.stringify(map2))使用map2. 如果您认为它是一个大对象并且会影响性​​能,请采用递归复制的嵌套实现!;-)


idm*_*rov 5

for (let key in map1) {
    map2[key] = map1[key];
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你为什么不使用 Object.assign(); ? (注意:它返回一个新对象)

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

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


Mat*_*w P 2

您可以这样做 - 循环遍历键数组:

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]];
}
Run Code Online (Sandbox Code Playgroud)

我建议不要使用 for..in 循环,即在其他答案之一中使用的循环,因为它们比本机 for 循环(如上面使用的)慢。您可以在此处查看有关性能的一些详细信息:比较 JavaScript 循环性能(for、do while、for in)

如果您只是对从字面上复制该对象感兴趣,您可以这样做:

let myMap2 = JSON.parse(JSON.stringify(myMap1));
Run Code Online (Sandbox Code Playgroud)

另一个答案建议使用 Object.assign() ,另一个答案建议使用 ES6 扩展运算符,但这些将“浅层”复制对象,这意味着对象正在使用对原始对象的引用,并且只会复制对象的顶层 - 上面的方法我通常发现深度复制对象是大多数用例所需的,并且会复制对象的每个级别。