Как перезаписать значения объектов JavaScript с помощью Object () - PullRequest
0 голосов
/ 16 сентября 2018

Я все еще немного новичок в 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

Похоже, что существующие данные [ключ] ссылаются не на ключ в паре ключ / значение, а на значение или что-то в этом роде? Как мне сказать, "для этого имени ключа во втором объекте установить это значение?" Я всегда искал в Google, и все либо делали это по-старому (с индексами), либо слишком усложнялись без особой причины. Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

0 голосов
/ 16 сентября 2018

Просто используйте Object.assign(map2, map1) для обновления map2 (скопируйте ключ / значение map1 в map2)

Или вы можете использовать

map2 = {...map2, ...map1} для созданияновый объект и замените map2 полностью

Чтобы получить глубокую копию, вместо только первого уровня вы можете использовать JSON.parse(JSON.stringify(map2)) вместо map2.Если вы думаете, что это большой объект и это влияет на производительность, используйте рекурсивную реализацию вложенного копирования!; -)

0 голосов
/ 16 сентября 2018

Вы можете перебирать ключи.проверить это полезно для вас

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]])
}
0 голосов
/ 16 сентября 2018
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

0 голосов
/ 16 сентября 2018

Вы можете просто сделать это - перебирая массив ключей:

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 (как использовано выше). Некоторые подробности, касающиеся производительности, вы можете увидеть здесь: Сравнение производительности циклов JavaScript (for, do while, for in)

Если вы просто заинтересованы в буквальном дублировании объекта, вы можете сделать это следующим образом:

let myMap2 = JSON.parse(JSON.stringify(myMap1));

В другом ответе предложено использовать Object.assign (), а в другом - использовать операторы распространения ES6, но они будут «поверхностно» копировать объект, что означает, что объекты используют ссылки на исходный объект, и будет копировать только верхний уровень объекта - метод выше глубоко копирует объект, который я обычно нахожу, является тем, что требуется для большинства случаев использования, и будет копировать каждый уровень объекта.

...