javascriptでObjectのコピー
javascriptのオブジェクトは関数に渡したり変数に渡したりすると問答無用で参照渡しされます。 仮にオブジェクトにこの値を入れてみて探索したい、といったときに参照渡しということをを忘れているとひどい目に合います。合いました。本当にありがとう。 こういうときどうするかというと、参照渡しされたオブジェクトの要素を走査して、プリミティブ型の値として取り出し、新しいオブジェクトをに突っ込みます。 具体的にはこうです。
var oldObject = {"a":1, "b":2}; var newObject = {}; for(var i in oldObject){ newObject[i] = oldObject[i]; } newObject["a"] = 100; console.log(oldObject) => {"a":1, "b":2} console.log(newObject) => {"a":100, "b":2}
しかしながらオブジェクトの中にオブジェクトがネストしているようなオブジェクトは多々あります。以上の方法だと例えば
var oldObject = {"a":1,"b":2 "c":{"d":3,"e":4}};
のようなオブジェクトは結局oldObject["c"]はnewObject["c"]へ参照渡しされてしまいます。調べたところネストされたオブジェクトの確率されたコピー方法がjQueryのextend以外これといったものが無いようでしたので以下のような方法を提唱します。
var copyObject = function(obj){ var copy = {}; for(var i in obj){ if(typeof obj[i] == "object") copy[i] = copyObject(obj[i]); else clone[i] = obj[i]; } return clone; };
copyObjectに渡されたオブジェクトが内包するオブジェクトもすべてプリミティブ型まで掘り下げてコピーしてくれます。
- 作者: David Flanagan,村上列
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/08/10
- メディア: 大型本
- 購入: 12人 クリック: 252回
- この商品を含むブログ (17件) を見る
開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質
- 作者: Cody Lindley,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
- 作者: Douglas Crockford,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/12/22
- メディア: 大型本
- 購入: 94人 クリック: 1,643回
- この商品を含むブログ (185件) を見る