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

时间:2016-01-29 10:56:08

标签: javascript

我希望能够通过将两个值一起添加来合并它们。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

首先,让我们定义一个抽象函数,它将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));
}

如果你对第一个被更改的对象没问题,你可以跳过clone步骤,然后通过x

答案 1 :(得分:0)

我的尝试

MergeRecursive({ "a" : 1, "b" : 3, "d": {"da": 1}},{ "a" : 1, "c" : 34, "d": {"da": 2} })

用作

    for ($i=1;$i<=1000;$i++)
{
    $x2=rand(0,100);
    $x3=rand(0,100);
    $sql="INSERT INTO data(integer1,integer2) VALUES ($x2,$x3)";
$conn->query($sql);     
}

答案 2 :(得分:0)

创建resultArray以避免obj1的复杂性。然后只需将obj1中的每个值添加到resultArray中,如果obj2中的相应键存在,则将obj2的值累积。

然后将第一次迭代中尚未添加的obj2中的每个键添加到resultArray中,这样就不会丢失来自obj2的数据。

   function MergeRecursive(obj1, obj2) {
       resultArray = [];
       for (var key in obj1) {
           if ( typeof obj1[key] === 'object') {
               resultArray[key] = MergeRecursive(obj1[p], obj2[p]);
           } else {
               resultArray[key] = obj1[key] + obj2[p] ?? 0;
           }
       }
       for (var key in obj2) {
           if (key in resultArray){
               continue;
           }
           resultArray[key] = obj2[key];
       }
       return resultArray;
     }