我对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,项目的索引等,并且它会产生很多代码,这些代码本来应该很简单。
查看MDN文档中的Object(),看起来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
看起来现存的[key]并没有引用键/值对中的键,而是值或其他东西?我如何告诉它,“对于第二个对象中的此键名,设置此值?”我一直在Google上进行搜索,而所有操作要么都按照旧方法(带有索引)进行,要么由于没有特殊原因而过于复杂。任何帮助将不胜感激。
答案 0 :(得分:3)
for (let key in map1) {
map2[key] = map1[key];
}
顺便说一句,为什么不使用Object.assign(); ? (注意:它将返回一个新对象)
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
答案 1 :(得分:1)
您可以执行此操作-遍历一系列键:
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));
使用Object.assign()建议使用另一个答案,而使用ES6扩展运算符建议使用另一个答案,但是这些将“浅化”复制对象,这意味着这些对象正在使用对原始对象的引用,并且只会复制该对象的顶层-上面的方法会深度复制我通常发现的对象,这是大多数用例所需要的,并将复制对象的每个级别。
答案 2 :(得分:0)
您可以遍历键。检查对您有帮助
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]])
}
答案 3 :(得分:0)
只需使用Object.assign(map2, map1)
来更新map2
(将map1
的键/值复制到map2
)
或者您可以使用
map2 = {...map2, ...map1}
构建新对象并完全替换map2
要获得深层副本,可以使用JSON.parse(JSON.stringify(map2))
而不是map2
而不是第一级。如果您认为这是一个很大的对象并影响性能,请递归地执行嵌套的嵌套实现! ;-)