我希望能够通过将两个值一起添加来合并它们。
> 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;
}
有什么想法吗?
答案 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;
}