node-json-merge
Version:
This package provides api to merge 2 json objects, with customization in nodejs.
116 lines (97 loc) • 3.23 kB
JavaScript
var obj1 = require('./obj1.json');
var obj2 = require('./obj2.json');
function isJson(json) {
if (json && json.constructor === {}.constructor) {
return true;
} else {
console.log("ERROR: ", json, " not a JSON object");
return false;
}
}
module.exports.jsonMerge = function(obj1, obj2, options) {
var mergeMode = {
"stringArrayMerge": false,
"arrayNestedMerge": false,
"arrayMerge": false,
"objectArrayMerge": false,
"objectMerge": false
}
if (options) {
for (mode in options) {
if (mergeMode.hasOwnProperty(mode)) {
mergeMode[mode] = options[mode];
} else {
console.log("ERROR: Invalid option '" + mode + "'");
return
}
}
}
if (isJson(obj1) && isJson(obj2)) {
var resultJson = JSON.parse(JSON.stringify(obj1));
for (key in obj2) {
checkKeyTypeFn(key);
}
return resultJson;
} else {
console.log("ERROR: Invalid JSON arguement passed");
}
function checkKeyTypeFn(key) {
if (typeof obj2[key] === "string") {
stringMergeFn(key);
} else if (obj2[key].constructor === Array) {
arrayMergeFn(key);
} else if (obj2[key].constructor === {}.constructor) {
jsonMergeFn(key);
} else {
resultJson[key] = obj2[key];
}
}
function stringMergeFn(key) {
if (resultJson[key] && typeof resultJson[key] === "string") {
if (mergeMode.stringArrayMerge) {
var temp = [resultJson[key], obj2[key]];
resultJson[key] = temp;
} else {
resultJson[key] = obj2[key];
}
} else {
resultJson[key] = obj2[key];
}
}
function arrayMergeFn(key) {
if (resultJson[key] && resultJson[key].constructor === Array) {
if (mergeMode.arrayNestedMerge) {
var temp = [resultJson[key], obj2[key]];
resultJson[key] = temp;
} else if (mergeMode.arrayMerge) {
resultJson[key] = resultJson[key].concat(obj2[key]);
} else {
resultJson[key] = obj2[key];
}
} else {
resultJson[key] = obj2[key];
}
}
function jsonMergeFn(key) {
if (resultJson[key] && resultJson[key].constructor === {}.constructor) {
if (mergeMode.objectArrayMerge) {
var temp = [resultJson[key], obj2[key]];
resultJson[key] = temp;
} else if (mergeMode.objectMerge) {
for(prop in obj2[key]) {
resultJson[key][prop] = obj2[key][prop];
}
} else {
resultJson[key] = obj2[key];
}
} else {
resultJson[key] = obj2[key];
}
}
}
var res = jsonMerge(obj1, obj2, {
"stringArrayMerge": false,
"arrayMerge": true,
"objectArrayMerge": true
});
console.log(res);