【问题标题】:python dict.update() equivalent in javascriptjavascript中的python dict.update()等价物
【发布时间】:2018-07-22 16:31:52
【问题描述】:

我想在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];
        }

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

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];
            }
        }

但是如果我尝试将函数分离为-

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]);
    }

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

【问题讨论】:

  • 你的字典是如何创建的,你能上传一些你的代码吗?
  • new 是保留关键字。尝试使用其他词,例如new_dict
  • 您会重新考虑您接受的答案吗? ;-)

标签: javascript dictionary


【解决方案1】:

您可以使用destructuring assignment

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"
}
*/

【讨论】:

  • 它也适用于对象!?惊人的。这是正确答案!
  • 这是 ECMA6,但得到了广泛的支持:kangax.github.io/compat-table/es6/#test-spread_(...)_operator
  • 在 Chrome 70 中,Object.assign 比解构赋值快一个数量级以上。而在 Firefox 62 中,它的速度几乎快了四倍。请参阅@CasualCoder3 的答案。
  • 这应该是公认的答案! Python 等价于 d1 = {**d2, **d3)
【解决方案2】:

您可以使用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}

注意Object.assign() 修改了第一个参数,这就是我们在上面传递一个空对象的原因。

您甚至可以传入一系列对象来更新target 对象,查看MDN link 了解更多信息

【讨论】:

  • 在 Chrome 70 和 Firefox 62 中,Object.assign 是最快的。使用 for-in 是第二快的。最慢的是具有解构赋值的展开运算符 (...)。
  • 值得一提的是,target 既被修改又被返回,因此不需要像本例中那样使用newObj(该变量名具有误导性,因为它不是新对象,而只是修改了target) .
【解决方案3】:
  • 如果您使用的是Map 实例,只需调用yourMap.set(key, newValue)
  • 如果您使用的是基本 JavaScript 对象,请使用以下任一方法:
    • 点符号yourObject.yourProperty = newValue
    • 方括号yourObject['your-property'] = newValue

没有像 Python 这样的“批量”更新。这将取决于您如何构建数据以及您需要走多远。

【讨论】:

  • @user2715898 你应该问另一个问题
【解决方案4】:

function update_dic(a,b){
	for(key in b){
		a[key]     = b[key]
    }
	return a;
}
var  a = {1:45,4:56}
var b  = {1:56,6:67,67:67}
a = update_dic(a,b)
console.log(a)

【讨论】:

  • var obj1 = {'a':1,'b':6}; var obj2 = {'b':2,'c':3}; Object.assign(obj1,obj2) ; console.log(obj1)
  • 如果没有返回(并删除倒数第二行中的a =)会更正确。Python 的 dict.update 进行就地更新,并且不返回值。
【解决方案5】:

Lodash assign 函数应该可以解决问题。见https://lodash.com/docs/4.17.11#assign

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 2013-08-25
    • 1970-01-01
    • 2013-10-08
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多