【发布时间】:2019-02-20 18:12:07
【问题描述】:
我对 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] 没有引用键/值对中的键,而是引用值或什么?我如何告诉它,“对于第二个对象中的这个键名,设置这个值?”我一直在谷歌上搜索,一切要么以旧方式(使用索引)进行,要么无缘无故过于复杂。任何帮助将不胜感激。
【问题讨论】:
-
我无法在最后一个代码中重现您的问题。我已将其更改为 sn-p,因此它可以在浏览器中运行,并且显示的结果与您报告的不同。
-
我忘了在我的标签中添加“nodejs”,只是在问题中简单地提到了它——我很抱歉——这只是后端的东西,所以它在浏览器中可能不一样(尽管我会期望它是相同的)。
-
看起来你已经找到了适合你的答案,但作为一个仅供参考,我在节点中得到的结果与我在浏览器中使用上述代码所做的结果完全相同。如果你得到不同的东西,那就是不同的问题。
标签: javascript arrays ecmascript-6 javascript-objects