web-dev-qa-db-ja.com

JQueryでハッシュ/オブジェクトをコピー/クローンする方法は?

私はJavascriptでシンプルなオブジェクト(またはハッシュ)を持っています:

_var settings = {
  link: 'http://example.com',
  photo: 'http://photos.com/me.jpg'
};
_

コピーが必要です。同じ属性を持つ別のオブジェクトを提供するsettings.clone()タイプのメソッドはありますか?私はjQueryを使用しているので、jQueryユーティリティメソッドが存在する場合はそれを使用して満足です。

37
at.

はい、 extend 元のオブジェクトと空のオブジェクト。そうすれば、すべてが単純にコピーされます:

var clone = $.extend({}, settings);

満たされたオブジェクトを別のオブジェクトで拡張する、例えば:

$.extend({a:1}, {b:2})

戻ります:

{a:1, b:2}

同じロジックで:

$.extend({}, {foo:'bar', test:123})

戻ります:

{foo:'bar', test:123}

つまり、事実上クローンです。

61
pimvdb

JQuery以外の方法で。

_var newObj = {};

Object.keys(settings).forEach(function(key) {
     newObj[ key ] = settings[ key ];
}); 
_

これにより、最上位のプロパティのみがコピーされます。ネストされたオブジェクトを含むハッシュをプロパティ値としてコピーするには、再帰関数を使用する必要があります。

NB:Object.keys(settings)は、settings.hasOwnProperty(key)を呼び出す必要を回避します。

32
Pantelis
var clone = $.extend(true, {}, settings);

最初の引数をtrueに設定します。

編集:最初の引数trueはディープコピーを意味します。元の質問の例では、単純な不変のキーと値のペアがあるため、ディープコピーの必要はありません。タイトルに質問がある場合-一般的な場合-ディープコピーを使用します。それ以外の場合は、ハーフコピーを取得します。

4
Rax

オブジェクトをコピーできるjQuery拡張が必要な​​ようです。

http://api.jquery.com/jQuery.extend/

2
aepheus

私の2セント:

function clone(hash) {
  var json = JSON.stringify(hash);
  var object = JSON.parse(json);

  return object;
}

最も最適化されたオプションではないかもしれませんが、一部のシナリオでは便利です。

1
fguillen

Underscore.js 拡張機能もあります jQueryを使用していない場合:

extend_.extend(destination, *sources)ソースオブジェクトのすべてのプロパティを宛先オブジェクトにコピーし、宛先オブジェクトを返します。順序が正しいため、最後のソースは前の引数の同じ名前のプロパティをオーバーライドします。

_.extend({name: 'moe'}, {age: 50});
=> {name: 'moe', age: 50}
1
d-coded