You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

109 lines
2.1 KiB

/*
* Deep merge test: just check that key ordering is preserved etc.
*/
/*===
{
"foo": 123,
"bar": {
"quux": 234,
"baz": {
"prop5": 123,
"foo": 333,
"bar": 222
}
},
"prop1": 987
}
{
"foo": 234,
"prop2": 876,
"bar": {
"prop3": 765,
"baz": {
"prop6": 555,
"foo": 444
}
}
}
{
"foo": 234,
"bar": {
"quux": 234,
"baz": {
"prop5": 123,
"foo": 444,
"bar": 222,
"prop6": 555
},
"prop3": 765
},
"prop1": 987,
"prop2": 876
}
===*/
function deepMerge(a,b) {
// overriding value is not an object -> use as is
if (typeof b !== 'object') { return b; }
// overriding value is an object, but previous value is not -> use as is
if (typeof a !== 'object') { return b; }
// both are objects, merge keys recursively
var c = {};
var keyset = {}; // keys present in one or both
Object.keys(a).forEach(function (k) { keyset[k] = true; });
Object.keys(b).forEach(function (k) { keyset[k] = true; });
// merge keys, recursively
Object.keys(keyset).forEach(function (k) {
if (k in a) {
if (k in b) {
c[k] = deepMerge(a[k], b[k]); // k in a and b, merge
} else {
c[k] = a[k]; // k in a only
}
} else {
c[k] = b[k]; // k in b only
}
});
return c;
}
function deepMergeTest() {
var A = {
foo: 123,
bar: {
quux: 234,
baz: {
prop5: 123,
foo: 333,
bar: 222
}
},
prop1: 987,
};
var B = {
foo: 234,
prop2: 876,
bar: {
prop3: 765,
baz: {
prop6: 555,
foo: 444
}
}
};
print(JSON.stringify(A, null, 4));
print(JSON.stringify(B, null, 4));
print(JSON.stringify(deepMerge(A, B), null, 4));
}
try {
deepMergeTest();
} catch (e) {
print(e);
}