首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Object()覆盖JavaScript对象值

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

Stack Overflow用户
提问于 2018-09-17 02:33:45
回答 4查看 22.4K关注 0票数 3

我对JavaScript、Node等还是比较陌生的,并且来自Groovy背景(它的语法与JavaScript极其相似)。在Groovy中,我可以很容易地做这样的事情:

代码语言:javascript
复制
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已经实现了一些东西,允许开发人员访问键/值对,而不必处理原型和所有这些东西,并且您只能访问对象中的数据,而不是对象的属性。我现在有了这个:

代码语言:javascript
复制
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);
}

我认为这会起作用,但我在控制台中得到了以下内容:

代码语言:javascript
复制
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上搜索,所有的东西要么是老方法(使用索引),要么是过于复杂,没有特别的原因。任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-09-17 02:40:02

你可以这样做--循环遍历一个键数组:

代码语言:javascript
复制
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)

如果你只想从字面上复制对象,你可以这样做:

代码语言:javascript
复制
let myMap2 = JSON.parse(JSON.stringify(myMap1));

另一个建议使用Object.assign(),另一个建议使用ES6扩展运算符,但这些将“浅”复制对象,这意味着对象正在使用对原始对象的引用,并且只复制对象的顶层-上面的方法深度复制对象,这是我通常发现的大多数用例所需的,并将复制对象的每一层。

票数 1
EN

Stack Overflow用户

发布于 2018-09-17 02:45:39

代码语言:javascript
复制
for (let key in map1) {
    map2[key] = map1[key];
}

顺便说一下,你为什么不使用Object.assign();?(注意:它返回一个新对象)

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2018-09-17 03:09:57

只需使用Object.assign(map2, map1)更新map2 (将map1的键/值复制到map2)

或者你可以使用,

用于构建新对象并完全替换map2map2 = {...map2, ...map1}

要进行深度复制,您可以使用JSON.parse(JSON.stringify(map2))而不是map2,而不仅仅是第一级。如果您认为它是一个大对象,且会影响性能,请使用递归复制的嵌套实现!;-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52357239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档