我对 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 许可协议
你可以这样做 - 遍历键数组:
我建议不要使用 for..in 循环,即在其他答案之一中使用的循环,因为它们比本机 for 循环(如上所用)慢。您可以在此处查看有关性能的一些详细信息: Comparing JavaScript loops performance (for, do while, for in)
如果您只是对逐字复制对象感兴趣,您可以这样做:
Anouter answer suggested using Object.assign() and another suggested using ES6 spread operators 但这些将“浅”复制对象,这意味着对象正在使用对原始对象的引用并且只会复制对象的顶层 - 上面的方法深度复制我通常发现的对象是大多数用例所需要的,并将复制对象的每个级别。