问答

通过递归添加它们的值来合并2个javascript对象

 来源    2019-06-28    0  

我想通过将它们的值一起添加来合并两个对象.

> a
{ "a" : 1, "b" : 3, "d": {"da": 1}}
> b
{ "a" : 1, "c" : 34, "d": {"da": 2} }

我想获得:

> { "a" : 2, "b": 3, "c" : 34, "d": {"da": 3} }

我试过这个,但它不起作用:

 function MergeRecursive(obj1, obj2) {
   for (var p in obj2) {
     try {
       // Property in destination object set; update its value.
       if ( obj2[p].constructor==Object ) {
         obj1[p] += MergeRecursive(obj1[p], obj2[p]);

       } else {
             obj1[p] = obj2[p];
       }

     } catch(e) {
       // Property in destination object not set; create it and set its value.
             obj1[p] = obj2[p];
     }
   }
   return obj1;
 }

有任何想法吗 ?

首先,让我们定义一个抽象函数,它将func应用于两个对象的组合,然后将它与求和函数一起使用.

function merge(x, y, fn) {
    var result = {};

    Object.keys(x).forEach(function(k) {
        result[k] = x[k];
    });

    Object.keys(y).forEach(function(k) {
        result[k] = k in x ? fn(x[k], y[k]) : y[k];
    });

    return result;
}

function add(p, q) {
    if(typeof p === 'object' && typeof q === 'object') {
        return merge(p, q, add);
    }
    return p + q;
}

a = { "a" : 1, "b" : 3, "d": {"da": 1}};
b = { "a" : 1, "c" : 34, "d": {"da": 2}};

sum = merge(a, b, add)
document.write('<pre>'+JSON.stringify(sum,0,3));

merge也可以用更实用的样式编写,如下所示:

function clone(x) {
    return Object.keys(x).reduce(function(res, k) {
        res[k] = x[k];
        return res;
    }, {});
}

function merge(x, y, fn) {
    return Object.keys(y).reduce(function(res, k) {
        res[k] = k in x ? fn(x[k], y[k]) : y[k];
        return res;
    }, clone(x));
}

如果您对第一个被更改的对象没问题,可以跳过克隆步骤并传递x.

相关文章
合并两个javascript对象,添加公共属性的值
问答我有两个或更多的JavaScript对象.我想合并它们添加公共属性的值,然后按值的降序对它们进行排序. 例如 var a = {en : 5,fr: 3,in: 9} var b = {en: 8,f ...
javascript – 根据公共值组合/合并数组中的对象
问答我有一个像下面这样的数组. [ { sku: 'TEA-BLCK', price: '10', quantity: '1' }, { sku: 'TEA-ELGY', price: '10', qua ...
将具有相同键值的数组中的JavaScript对象组合在一起
问答我一直在尝试将具有相同id值的数组内的对象组合在一起.我拥有的数组是这样的: [ {"id" : "abcd","val1" : 1,&qu ...
如何合并2个JavaScript对象,如果另一个不存在,则将属性填入一个
问答如果我有一个javascript对象/ assoc.数组定义如下: function somefunction(options) { var defaults = { prop1: 'foo', pr ...
如何动态合并两个JavaScript对象的属性?
问答我需要能够在运行时合并两个(非常简单)JavaScript对象.例如我想: var obj1 = { food: 'pizza', car: 'ford' } var obj2 = { animal: ...
当然ES6必须有一种方法来合并两个javascript对象在一起,是什么?
问答我厌倦了总是不得不写这样的代码: function shallowExtend(obj1,obj2){ var key; for ( key in obj2 ) { if ( obj2.hasOwnP ...
如何匹配dict中的两个值并合并结果
问答假设我有一些带有时间戳,价格和金额的数据.此数据可能非常大,并且匹配条件可能发生在组中的任何位置.一个简单的例子如下所示: [{"date":1387496043,"pr ...
Java字段类型是否为一般递归自我类型的值?
问答给定一个类层次结构,其中基类定义递归自我类型: abstract class A<T extends A<T>> { } 我怎样才能声明另一个类(在T中不应该是通用的,因为这样 ...
algorithm – 二进制搜索树(BST)中的数字,添加到某个值
问答给定一个BST,是否有可能找到两个加起来给定值的数字,在O(n)时间和额外的内存很少.通过少量额外内存,暗示您无法将整个BST复制到阵列中.::如果你有子指针和父指针,这可以在O(n)时间和O(1)附 ...
python – 是否可以根据另一个向量的整数值组合(添加)向量的值
问答我正在尝试根据另一个向量的整数值添加向量的浮点值. 例如,如果我有: import numpy as np a = np.array([0.1,0.2,0.3,0.4,0.5,0.6,07.3,0.8 ...
php – 如何通过仅接收第二个数组中与第一个数组具有相同键的值来合并两个数组?
问答我想将两个数组相互合并: $filtered = array(1 => 'a', 3 => 'c'); $changed = array(2 => 'b*', 3 => 'c* ...
如果x值相同,如何添加元组y值?
问答start = [(1,2),(3,4),(1,3),(3,5)] 如果x值有效相同(我正在使用700,000个元组),如何添加元组y值? end = [(1,5),(3,9)] 我在想什么: 我试图 ...
jQuery复选框,用于启用/禁用文本输入并添加/删除默认值
问答我正在尝试创建一个小的可重用函数,当选中该函数时,将禁用文本字段并插入默认值"160",如果未选中,则启用该字段并删除该值.我已经完成了它,但是未检查的部分让我失望了. $('#c ...
shell – 如何在MongoDB中向字典添加另一个值?
问答这是我正在尝试做的一个例子,因为我无法解释我的意思. 我在mongo CLI中执行它:db.posts.insert({name:"Hello,world!,body:"这是我的第 ...
objective-c – NSArray:添加具有相同值的多个对象
问答如何向NSArray添加多个对象?每个对象都具有相同的值. 防爆. 我想将值"SO"添加到我的数组10次::您可以使用一组对象初始化数组: NSString * blah = @& ...
更改sqlite表以添加具有默认值的时间戳列
问答在sqlite中ALTER表ADD列foo时间戳默认为CURRENT_TIMESTAMP是不可能的,但是有没有聪明的解决方法?::SQLite在添加列时实际上不会修改表内容,因此默认值必须是不需要读取 ...
python – 在pandas dataframe中添加包含相同值的列
问答我有一个大小为(1500,5)的熊猫数据框A和一个字典D,其中包含: D Out[121]: {'newcol1': 'a', 'newcol2': 2, 'newcol3': 1} 对于字典中的每个 ...
将默认值添加到没有值的项目x组对(df%>%spread%>%gather看起来很奇怪)
问答精简版 怎么做手术 df1 %>% spread(groupid, value, fill = 0) %>% gather(groupid, value, one, two) 以更自然的方 ...
javascript – 如何转换分钟到小时/分钟,并使用jQuery一起添加各种时间值?
问答这个问题有几个部分.我不反对使用jQuery插件,如果任何人都知道一个,将完成我想做的. Q1 – 如何将分钟转换为小时,反之亦然?例如,我如何将90分钟转换为1小时30分钟.在下面的代码中如何获得& ...