如何使用Object()

时间:2018-09-16 18:33:45

标签: javascript arrays ecmascript-6 javascript-objects

我对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上进行搜索,而所有操作要么都按照旧方法(带有索引)进行,要么由于没有特殊原因而过于复杂。任何帮助将不胜感激。

4 个答案:

答案 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而不是第一级。如果您认为这是一个很大的对象并影响性能,请递归地执行嵌套的嵌套实现! ;-)