在javascript中等效的python dict.update()

use*_*898 8 javascript dictionary

我想在javascript中更新字典 - 修改现有值或添加新值 - 与python字典更新相同.

dict +或dict.update()似乎无法正常工作.有可能在javascript中这样做吗?

提前致谢!

data={"abc":{1:2,3:4}}

if (key in d) {
            d[key].update(data[key]);
        }
        else {
            d[key]={};
            d[key]=data[key];
        }
Run Code Online (Sandbox Code Playgroud)

编辑:更新字典工作正常如下 -

dg={"abc":{1:2,3:4},"sdc":{1:2,4:5}}
function upd(data) {
    for (key in data) {
        if (key in dg) {
            for (key2 in data[key]) {
                dg[key][key2]=data[key][key2];
            }
        }
        else {
            dg[key]={};
            for (key2 in data[key]) {
                dg[key][key2]=data[key][key2];
            }
        }
Run Code Online (Sandbox Code Playgroud)

但如果我尝试将功能分开 -

var old={};
var new={};
function update_dict(old,new) {
console.log(new,old);
    for (key2 in new) {
                old[key2]=new[key2];
            }
    return old;
}
function upd(data) {
for (key in data) {
    if (key in dg) {
        dg[key]=update_dict(dg[key],data[key]);
    }
    else {
        dg[key]={};
        dg[key]=update_dict(dg[key],data[key]);
    }
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误,说Uncaught SyntaxError:Unexpected token new.我真的尝试了很多排列,请建议.非常感谢!

Jef*_*rey 21

您可以使用解构分配.

const first_dict = { 'key_one': 'value_one', 'key_two': 'value_two' } 
const second_dict = { 'key_one': 'value_from_second_dict', 'key_three': 'value_three' }

const accumulative = {
  ...first_dict,
  ...second_dict
}

console.log(accumulative)

/* 
[object Object] {
  key_one: "value_from_second_dict",
  key_three: "value_three",
  key_two: "value_two"
}
*/
Run Code Online (Sandbox Code Playgroud)

  • 它也适用于对象!太棒了 这是正确的答案! (2认同)
  • 在 Chrome 70 中,“Object.assign”比解构赋值快一个数量级以上。在 Firefox 62 中,速度快了近四倍。请参阅@CasualCoder3 的回答。 (2认同)
  • 这应该是公认的答案!Python 等价物是 `d1 = {**d2, **d3)` (2认同)

小智 7

您可以用来Object.assign()完成工作。它将创建一个更新了所有键的新对象,并将任何新的键值对添加到新创建的对象。

const target = {c: 4, d: 5}
const source = {a: 1, b: 2, c: 3};

const newObj = Object.assign(target, source);

console.log(newObj); //=> {a: 1, b: 2, c: 3, d: 5}
Run Code Online (Sandbox Code Playgroud)

您甚至可以传入一系列对象来更新target对象,请查看MDN链接以获取更多信息

  • 值得一提的是,“target”会被修改并返回,因此不需要像本例中那样的“newObj”(该变量名称具有误导性,因为它不是一个新对象,而只是修改了“target”)。 (2认同)

Dan*_*ite 5

  • 如果您使用的是Map实例,只需调用yourMap.set(key, newValue).
  • 如果您使用的是基本 JavaScript 对象,则只需使用:
    • 点表示法yourObject.yourProperty = newValue
    • 方括号yourObject['your-property'] = newValue

没有像 Python 那样的“批量”更新。这将取决于您如何构建数据以及您需要深入研究的程度。