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

新手上路,请多包涵

我对 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;
}

这将遍历现有地图 (myMap1) 并将每个键的值复制到新地图 (myMap2),具有相同的键名。非常简单。然而,JS 有一个原型的概念,这让我很抓狂,因为你必须使用 hasOwnProperty、项目索引之类的东西,它会导致很多本应非常简单的代码。

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

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

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

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

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

原文由 NellaGnute 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
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]];
}

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

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

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

Anouter answer suggested using Object.assign() and another suggested using ES6 spread operators 但这些将“浅”复制对象,这意味着对象正在使用对原始对象的引用并且只会复制对象的顶层 - 上面的方法深度复制我通常发现的对象是大多数用例所需要的,并将复制对象的每个级别。

原文由 Matthew P 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题