Skip to content

Instantly share code, notes, and snippets.

@ww24
Created March 24, 2012 11:59
Show Gist options
  • Save ww24/2181560 to your computer and use it in GitHub Desktop.
Save ww24/2181560 to your computer and use it in GitHub Desktop.
再帰的なオブジェクトのマージ
/*
* 再帰的なオブジェクトのマージ 1 (クロスブラウザ)
*/
var merge = function (obj_a, obj_b) {
var key = {},
val = {},
hasOwn = Object.prototype.hasOwnProperty;
for (key.a in obj_a) {
if (hasOwn.call(obj_a, key.a)) {
for (key.b in obj_b) {
if (hasOwn.call(obj_b, key.b) && key.a === key.b) {
val.a = obj_a[key.a];
val.b = obj_b[key.b];
if (typeof val.a === 'object' && typeof val.b === "object")
arguments.callee(val.a, val.b);
else {
obj_a[key.a] = val.b;
}
delete obj_b[key.b];
}
}
}
}
for (key.b in obj_b) {
if (hasOwn.call(obj_b, key.b)) {
obj_a[key.b] = obj_b[key.b];
}
}
return obj_a;
};
// Usage
var obj = {
hoge: "hogehoge",
piyo: [
"ピヨ",
"piyopiyo"
]
};
obj = merge(obj, {test: "hello", piyo: ["piyo"]});
console.log(obj);
/*
* 再帰的なオブジェクトのマージ 2 (for Node.js)
*/
var merge = function (obj_a, obj_b) {
var merge = arguments.callee;
Object.keys(obj_a).forEach(function (key_a) {
Object.keys(obj_b).forEach(function (key_b) {
if (key_a === key_b) {
var val_a = obj_a[key_a],
val_b = obj_b[key_b];
if (typeof val_a === 'object' && typeof val_b === "object")
merge(val_a, val_b);
else {
obj_a[key_a] = val_b;
}
delete obj_b[key_b];
}
});
});
Object.keys(obj_b).forEach(function (key) {
obj_a[key] = obj_b[key];
});
return obj_a;
};
// Usage
var obj = {
hoge: "hogehoge",
piyo: [
"ピヨ",
"piyopiyo"
]
};
obj = merge(obj, {test: "hello", piyo: ["piyo"]});
console.log(obj);
@ww24
Copy link
Author

ww24 commented Mar 24, 2012

ObjectだけではなくArrayも再帰的にマージします

@ww24
Copy link
Author

ww24 commented Mar 24, 2012

recursive-object-merge.jsはブラウザで使う場合
rom1.jsは(Array.prototype.forEachが使える)新しいブラウザで使う場合
rom2.jsは引数に可変長のオブジェクトを渡す事ができる

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment