我对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
看起来existingDatakey没有引用键/值对中的键,而是值或其他什么?我如何告诉它,“对于第二个对象中的这个键名,设置这个值?”我一直在Google上搜索,所有的东西要么是老方法(使用索引),要么是过于复杂,没有特别的原因。任何帮助都将不胜感激。
发布于 2018-09-17 02:40:02
你可以这样做--循环遍历一个键数组:
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扩展运算符,但这些将“浅”复制对象,这意味着对象正在使用对原始对象的引用,并且只复制对象的顶层-上面的方法深度复制对象,这是我通常发现的大多数用例所需的,并将复制对象的每一层。
发布于 2018-09-17 02:45:39
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
发布于 2018-09-17 03:09:57
只需使用Object.assign(map2, map1)
更新map2
(将map1
的键/值复制到map2
)
或者你可以使用,
用于构建新对象并完全替换map2
的map2 = {...map2, ...map1}
要进行深度复制,您可以使用JSON.parse(JSON.stringify(map2))
而不是map2
,而不仅仅是第一级。如果您认为它是一个大对象,且会影响性能,请使用递归复制的嵌套实现!;-)
https://stackoverflow.com/questions/52357239
复制相似问题