web-dev-qa-db-ja.com

JavaScriptでオブジェクトを複製する

以下は最初に0を記録し、次に1を記録します。オブジェクトへの参照ではなく、オブジェクトのコピーを保存するにはどうすればよいですか?

debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
64
Matrym

JQueryでオブジェクトを複製するには:

var vi.nextSegment = jQuery.extend({}, vi.details);

注:上記は浅いコピーです:ネストされたオブジェクトまたは配列は参照によってコピーされます-vi.nextSegment.obj[prop]に加えた変更はすべてvi.details.obj[prop]に反映されます。 元のものと完全に分離の完全に新しいオブジェクトが必要な場合は、ディープコピーを行う必要があります(最初のパラメーターとしてtrueを渡します)。

var vi.nextSegment = jQuery.extend(true, {}, vi.details);

拡張の詳細については、 こちら をご覧ください。

129
Mike Lewis

投稿を見てください: javascriptオブジェクトを複製する最も効率的な方法は何ですか

John Resig's answer:

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

詳細については、 jQueryのドキュメント をご覧ください。

32
Scoobler

これは、jQueryの「parseJSON()」および「JSON.stringify()」を使用してオブジェクトのクローンを作成するのに役立ちました。

$.ajax({
  url: 'ajax/test.html',
  dataType: 'json',
  success: function(data) {
    var objY = $.parseJSON(JSON.stringify(data));
    var objX = $.parseJSON(JSON.stringify(data));
  }
});

ObjXとobjYのデータオブジェクトのクローン作成は2つの異なるオブジェクトであり、「参照による」問題を台無しにする必要はありません。

グラシアス!

8
Mecalito

オブジェクトを複製する別の方法は

newObj = JSON.parse(JSON.stringify(oldObj));

ただし、日付が含まれている場合は注意してください。その場合、JSON.parseはdateではなくdate.toString()を返します。

6
MarkosyanArtur

これは私が要素を数回コピーする方法です:

最初にテンプレートがあります:

<div class="forms-container">
    <div class="form-template">
        First Name <input>
         .. a lot of other data ...
        Last Name <input>
     <div>
     <button onclick="add_another();">Add another!</button>
<div>

さて、JavaScript:

function add_another(){
    jQuery(".form-template").clone().appendTo(".forms-container");
}

_Immutable.js_を試してください:

jQueryは主に_DOM Elements_を扱うので、そうでないかもしれないが仕事に適したツールになります。 _Immutable.js_は、Facebookによって作成された56 kb (minified)ライブラリです。

_// roughly implementing
import Immutable from 'immutable'
//
const oldObj = { foo: 'bar', bar: 'baz' }
// create a map from the oldObj and then convert it to JS Object
const newObj = Immutable.Map(oldObj).toJS()
_

このようにすると、newObjからoldObjを効果的に複製できます。基本的に、Mapがまだない場合は、最初にMapを作成する必要があります。マップは、copiesを作成するために使用する_blue-print_のようなものです。

参考文献:

ホーム-不変

ドキュメント-Immutable Docs

GitHub-Immutable @ GitHub

幸運を。

2
Akash