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.
再帰的なオブジェクトのマージ
/*
* 再帰的なオブジェクトのマージ
*/
var merge = function (obj_a, obj_b) {
var obj = {},
key_a,
key_b,
val_a,
val_b,
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") {
obj_a[key_a] = arguments.callee(val_a, val_b);
} else {
obj_a[key_a] = obj_b[key_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"
]
};
merge(obj, {test: "hello", piyo: ["piyo"]});
@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