JavaScriptでオブジェクトの配列をどのように複製しますか?


421

...各オブジェクトは、同じ配列内の他のオブジェクトへの参照も持っていますか?

この問題を最初に思いついたとき、私は

var clonedNodesArray = nodesArray.clone()

存在し、JavaScriptでオブジェクトを複製する方法に関する情報を検索します。StackOverflowで質問を見つけました(まったく同じ@JohnResigによって回答されました)。彼はjQueryを使用すると、

var clonedNodesArray = jQuery.extend({}, nodesArray);

オブジェクトを複製します。私はこれを試しましたが、これは配列内のオブジェクトの参照のみをコピーします。だから私が

nodesArray[0].value = "red"
clonedNodesArray[0].value = "green"

nodesArray [0]とclonedNodesArray [0]の両方の値が「緑」になります。それから私は試しました

var clonedNodesArray = jQuery.extend(true, {}, nodesArray);

これはオブジェクトを深くコピーしますが、FirebugとOpera Dragonflyの両方から「再帰が多すぎます」と「コントロールスタックオーバーフロー」のメッセージを受け取りました。

どうしますか これはすべきではないことですか?JavaScriptでこれを行う再利用可能な方法はありますか?

回答:


106

浅いコピーの問題は、すべてのオブジェクトが複製されないことです。各オブジェクトへの参照は各配列で一意ですが、最終的にそれを取得すると、以前と同じオブジェクトを処理します。クローンを作成する方法に問題はありません... Array.slice()を使用しても同じ結果になります。

ディープコピーに問題があるのは、循環オブジェクト参照が発生するためです。Deepは可能な限り深くなります。円がある場合、ブラウザが気絶するまで無限に動き続けます。

データ構造を有向非巡回グラフとして表現できない場合、ディープクローニングの汎用的な方法を見つけることができるかどうかはわかりません。循環グラフは多くのトリッキーなコーナーケースを提供し、一般的な操作ではないため、完全な解決策を書いた人はいないと思います(それが可能である場合でも、可能ではないかもしれません!このページで問題に関する良いコメントを見つけました

循環参照を持つオブジェクトの配列のディープコピーが必要な場合は、専用のデータ構造を処理するための独自のメソッドをコーディングする必要があると思います。

  1. ラウンド1では、配列内の他のオブジェクトを参照しないすべてのオブジェクトのクローンを作成します。各オブジェクトの原点を追跡します。
  2. ラウンド2では、オブジェクトをリンクします。

1
@PatrickdeKleijnの答えのための固定リンク:web.archive.org/web/20140222022056/http://my.opera.com/...
マイクSzyndel

531

オブジェクトにJSONシリアル化可能なコンテンツ(関数やなしNumber.POSITIVE_INFINITYなど)が含まれている限り、ループを使用して配列やオブジェクトを複製する必要はありません。これは、純粋なバニラの1行のソリューションです。

var clonedArray = JSON.parse(JSON.stringify(nodesArray))

以下のコメントを要約すると、このアプローチの主な利点は、配列自体だけでなく、配列の内容も複製することです。主な欠点は、JSONシリアル化可能なコンテンツでのみ作業できるという制限と、そのパフォーマンスです(これは、sliceベースのアプローチよりも大幅に劣ります)。


118
これはJSONデータで機能する可能性がありますが、配列にメソッドを持つオブジェクトの関数またはインスタンスが含まれている場合は、それらに別れを告げます。
sp0rkyd0rky 2014年

12
値Infinityを含む配列がある場合は注意してください。この値は失われます(後でnullになります)。(jsfiddle.net/klickagent/ehm4bd3s
klickagent.ch

13
(でも、これはあなたの配列はプリミティブだけが含まれていない限り、単に一般的に悪いアプローチであり、および/または自身が唯一の文字列/数/ブールプリミティブを含むオブジェクトnullundefinedJSONがそれらをサポートしていないため、問題になります)。さらに、これはに比べて非常に効率の悪い操作ですold_array.slice(0);
XML

2
配列のオブジェクトにDateTimeがある場合、DateTimeの代わりに文字列が返されます。新しい日付!== JSON.parse(JSON.stringify(new Date))
MarkosyanArtur

2
OPの質問の重要な行です。
XML

288

Object.assignを使用してオブジェクトの配列の複製を解決しました

const newArray = myArray.map(a => Object.assign({}, a));

またはスプレッド構文ではさらに短い

const newArray = myArray.map(a => ({...a}));

15
しかし、myArrayに多数の恐竜が含まれている場合、newArrayには多数のオブジェクトが含まれます。それは不十分です、あなたは同意しませんか?
マシュージェームスデイビス

3
オブジェクトの機能を維持するための最善の方法、rathenはJSON.parse(JSON.stringify(nodesArray))でそれらを失います
scipper

14
あなたは置き換えることによって、この問題を解決することができ@MatthewJamesDavis {}new Dinosaur()
Agargara

5
深いコピーではなく浅いコピー
スルタンアスラム

1
オブジェクトのプリミティブプロパティのみが含まれている場合、これはオブジェクトの配列に最適です...これは私が必要としていたことです。ありがとう
mojave

154

必要なのが浅いコピーである場合、本当に簡単な方法は次のとおりです。

new_array = old_array.slice(0);

6
合格する必要はないと思います。とにかく、少なくともchromeで0呼び出すことができ.slice()ます
slf

112
これは実際には機能しませんが、そうですか?つまり、オブジェクトの配列を複製する方法の質問に対する答えではありません。これは、単純なアレイを複製するソリューションです。
bozdoz 2013

35
実際、これはオブジェクト配列では機能しません。返される配列sliceは新しい配列になりますが、元の配列オブジェクトへの参照が含まれます。
セルジオA. 14年

4
これは、 "generics" int、stringなどに対してのみ機能し、オブジェクトの配列には機能しません。
Stefan Michev 2014年

5
オブジェクトの配列の場合、これは実際には複製されません。new_arrayを更新すると、old_arrayも更新されます。
Anas

44

このクローンを作成する最良かつ最新の方法は次のとおりです。

...ES6スプレッド演算子を使用します。

最も単純な例を次に示します。

var clonedObjArray = [...oldObjArray];

このようにして、配列を個々の値に展開し、[]演算子を使用して新しい配列に配置します。

以下に、さまざまな動作を示す長い例を示します。

let objArray = [ {a:1} , {b:2} ];

let refArray = objArray; // this will just point to the objArray
let clonedArray = [...objArray]; // will clone the array

console.log( "before:" );
console.log( "obj array" , objArray );
console.log( "ref array" , refArray );
console.log( "cloned array" , clonedArray );

objArray[0] = {c:3};

console.log( "after:" );
console.log( "obj array" , objArray ); // [ {c:3} , {b:2} ]
console.log( "ref array" , refArray ); // [ {c:3} , {b:2} ]
console.log( "cloned array" , clonedArray ); // [ {a:1} , {b:2} ]


2
古いブラウザー(IE 11など)では機能しない最新の良い答え
Jealie

1
@Jealie KingpinEXは、es6をBabelでより普遍的に役立つものに変換したり、何を使っているのかをこの回答の対象にしたと思います。
ルフィン

61
これは、配列の各オブジェクトではなく、配列を深くコピーします。
ToivoSäwén2017

31
@ToivoSäwénが言ったことをフォローアップするために、これは配列内のオブジェクトをディープコピーしません。元のオブジェクトを引き続き参照するため、それらを変更すると、元の配列にも影響を与えます。
Joel Kinzel 2017年

3
これはプリミティブでのみ機能します。これを試してください:objArray [0] .a = 3; オブジェクトの参照がclonedArrayで同じままであることがわかります。
Sergio Correa

25

これは私にとってはうまくいきます:

var clonedArray = $.map(originalArray, function (obj) {
                      return $.extend({}, obj);
                  });

配列内のオブジェクトの深いコピーが必要な場合:

var clonedArray = $.map(originalArray, function (obj) {
                      return $.extend(true, {}, obj);
                  });

1
これはうまくいくようです。私は、jQueryの広範な使用を避けようとしているので、私の状況では使用しませんが、forループとfor ... inは機能します。
bozdoz 2013

19
$.evalJSON($.toJSON(origArray));

2
このコード
p /

32
JQがない場合(最新のブラウザではJSON.parse(JSON.stringify(origArray));
問題ありません

このコメントは役に立ちました。私の実装では、KnockoutJS監視可能プロパティが適用されたオブジェクトの配列のコピーを作成する必要がありました。コピーに必要なのは値のみであり、観察可能性は必要ありません。JUSTのコピーを作成するために、JSON.parse(ko.toJSON(origArray))またはko.utils.parseJson(ko.toJSON(origArray))を使用して値を作成しました。ちょうど私の2セントと私のソリューションに到達するのを手伝ってくれてありがとう。
wavedrop 2013

6
JSON.parse(JSON.stringify(origArray));間違いなく最も簡単なソリューションです。
ヨーク2013

多くの場合、jQueryは不要です。youmightnotneedjquery.com
ADJenks

9

マップは古い配列から新しい配列を作成し(古い配列への参照なし)、マップ内で新しいオブジェクトを作成し、プロパティ(キー)を反復処理し、古い配列オブジェクトの値を対応するプロパティに新しいオブジェクトに割り当てます。

これにより、まったく同じオブジェクトの配列が作成されます。

let newArray = oldArray.map(a => {
               let newObject = {};
               Object.keys(a).forEach(propertyKey => {
                    newObject[propertyKey] = a[propertyKey];
               });
               return newObject ;
});

8

痛みを伴う再帰を行わずに、問題のオブジェクトの詳細をすべて知らなくても、これを行う簡単な方法があるかもしれません。jQueryを使用する場合は、jQueryを使用してオブジェクトをJSONに変換し、$.toJSON(myObjectArray)JSON文字列を取得してオブジェクトに評価します。バム!完了しました!問題が解決しました。:)

var oldObjArray = [{ Something: 'blah', Cool: true }];
var newObjArray = eval($.toJSON(oldObjArray));

21
いくつかの最近のブラウザーには、JSONメソッドが組み込まれているため、これを行うことができます:JSON.parse(JSON.stringify(MY_ARRAY))これは、より高速である必要があります。良い提案。
ニコラR

1
また、json2を使用しない場合は使用しませんeval
kamranicus

これはひどいパフォーマンスですが、残念ながら私が見た中で最高の答えです:/
Dvid Silva '25

ユーザーデータについては何も評価しないでください。なるべく使用eval()しないでください。これはセキュリティリスクです。
ADJenks

8

「Javascriptでオブジェクトの配列を複製する」という問題に対する単純で明確な解決策がないように思われるので、私はこの質問に答えています。

function deepCopy (arr) {
    var out = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        var item = arr[i];
        var obj = {};
        for (var k in item) {
            obj[k] = item[k];
        }
        out.push(obj);
    }
    return out;
}

// test case

var original = [
    {'a' : 1},
    {'b' : 2}
    ];

var copy = deepCopy(original);

// change value in copy
copy[0]['a'] = 'not 1';

// original[0]['a'] still equals 1

このソリューションは、配列の値を繰り返し、次にオブジェクトキーを繰り返し、後者を新しいオブジェクトに保存してから、その新しいオブジェクトを新しい配列にプッシュします。

jsfiddleを参照してください。注:配列のオブジェクトについては、単純な.slice()もの[].concat()では不十分です。


回答に感謝しますが、回答の欠点を強調する必要があります。オブジェクトにオブジェクトが含まれている場合は機能しません。
過酷な

浅いコピーを作成します。深くない
スルタンアスラム

どこかに再帰を追加する必要があります
DGoiko

6

jQuery拡張は正常に機能しています。オブジェクトではなく配列を複製することを指定する必要があるだけです(extendメソッドのパラメーターとして、{}ではなく[]に注意してください)。

var clonedNodesArray = jQuery.extend([], nodesArray);

2
うーん、これに反対票を投じた場合、なぜそうするのかコメントを追加していただけますか?または、最初にコードを試して、機能するかどうかを確認できますか?ありがとう;)
Stef 2016年

1
最初の配列のオブジェクトを変更すると、2番目の配列のオブジェクトが変更されるため、問題があります。
Spikolynn 2017年

6

この方法は非常に簡単で、元の配列を変更せずにクローンを変更できます。

// Original Array
let array = [{name: 'Rafael'}, {name: 'Matheus'}];

// Cloning Array
let clone = array.map(a => {return {...a}})

// Editing the cloned array
clone[1].name = 'Carlos';


console.log('array', array)
// [{name: 'Rafael'}, {name: 'Matheus'}]

console.log('clone', clone)
// [{name: 'Rafael'}, {name: 'Carlos'}]


1
これは、2レベルの深さの浅いコピー[...oldArray]oldArray.slice(0)実行しますが、1レベルの深さの浅いコピーを実行します。これは非常に便利ですが、実際の完全なディープクローンではありません。
Ben Wheeler

真のディープクローンはlodash.clonedeep、npm を使用して行うことができます
改修します

5

Daniel Lewが述べたように、循環グラフにはいくつかの問題があります。この問題が発生した場合は、特別なclone()、問題のあるオブジェクトにメソッドをすでにコピーしたオブジェクトを覚えておきます。

copyCountコードでコピーするたびに1ずつ増加する変数を使用します。低いオブジェクトcopyCount現在のコピープロセスよりもがコピーされます。そうでない場合は、すでに存在するコピーを参照する必要があります。これにより、オリジナルからそのコピーにリンクする必要があります。

まだ1つの問題があります。それはメモリです。あるオブジェクトから別のオブジェクトへのこの参照がある場合、それらは常にどこかから参照されるため、ブラウザがそれらのオブジェクトを解放できない可能性があります。すべてのコピー参照をNullに設定する2番目のパスを作成する必要があります。(これを行う場合、aを指定する必要はありませんが、2番目のパスで値をリセットできるため、copyCountブール値isCopiedで十分です。)


4

Array.sliceは...配列の配列または一部をコピーするために使用することができ http://www.devguru.com/Technologies/Ecmascript/Quickref/Slice.html 内の文字列を変更する- 。これは、文字列と数値で動作します1つの配列は他の配列には影響しませんが、オブジェクトは参照によってコピーされるだけなので、1つの配列で参照されているオブジェクトを変更すると、他の配列に影響します。

これは、これに役立つ可能性があるJavaScriptのundoマネージャーの例です。http//www.ridgway.co.za/archive/2007/11/07/simple-javascript-undo-manager-for-dtos.aspx


知っている。これを実装したかったのは、バックトラックでCSPの問題を解決しようとしているためです。私は、バックトラックを実装する方法の1つは、変数の割り当ての状態を「スナップショットを撮る」ようなものであると思いました...このようなスナップショットをスタックに複製します。
wallyqs

...そしてまあ、それは実際には非常に悪い考えかもしれません。
wallyqs 2009

そのアプローチでは、他の同期の問題が発生する可能性があります:)。スナップショットの作成中にアレイが変更されていないことをどのようにして知ることができますか?
マルクト

著者はJavaScriptを使用して、簡単なアンドゥマネージャを実装記事へのリンクを追加しました...
マルクト

4

私のアプローチ:

var temp = { arr : originalArray };
var obj = $.extend(true, {}, temp);
return obj.arr;

元の配列の素敵でクリーンなディープクローンを取得します。元のオブジェクトに参照されるオブジェクトはありません:-)


これは、jqueryを使用する最良のソリューションです。短くて甘い。
John Henckel、2016年

1
私はパフォーマンステストを行いましたが、このソリューションはJSON.stringifyソリューションより約2倍高速であるようです。
meehocz 2017年

4

lodashはcloneDeepこの目的のために機能します:

var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);

4

ディープクローンを実装する場合は、JSON.parse(JSON.stringify(your {}または[]))を使用します。

const myObj ={
    a:1,
    b:2,
    b:3
}

const deepClone=JSON.parse(JSON.stringify(myObj));
deepClone.a =12;
console.log("deepClone-----"+myObj.a);
const withOutDeepClone=myObj;
withOutDeepClone.a =12;
console.log("withOutDeepClone----"+myObj.a);


3

eval()を忘れる(JSの最も誤用されている機能であり、コードが遅くなります)およびslice(0)(単純なデータ型でのみ機能します)

これは私にとって最良の解決策です:

Object.prototype.clone = function() {
  var myObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i != 'clone') {
        if (this[i] && typeof this[i] == "object") {
          myObj[i] = this[i].clone();
        } else 
            myObj[i] = this[i];
        } 
    }
  return myObj;
};

3

私はこの問題にかなり苛立っていました。どうやらこの問題は、ジェネリック配列を$ .extendメソッドに送信するときに発生します。だから、それを修正するために、私は少しチェックを追加しました、そしてそれは一般的な配列、jQuery配列、そしてあらゆるオブジェクトで完全に動作します。

jQuery.extend({
    deepclone: function(objThing) {
        // return jQuery.extend(true, {}, objThing);
        /// Fix for arrays, without this, arrays passed in are returned as OBJECTS! WTF?!?!
        if ( jQuery.isArray(objThing) ) {
            return jQuery.makeArray( jQuery.deepclone($(objThing)) );
        }
        return jQuery.extend(true, {}, objThing);
    },
});

呼び出し:

var arrNewArrayClone = jQuery.deepclone(arrOriginalArray);
// Or more simply/commonly
var arrNewArrayClone = $.deepclone(arrOriginalArray);

ディープクローン?私はjquery-1.9.1を使用していますが、この方法はサポートされていません。よりモダンなバージョンの方法ですか?
user5260143 2014年

@ user2783091彼はその関数を追加するためにJQueryを拡張しています。箱から出したものではありません
JorgeeFG 2014年

3

これは、配列、オブジェクト、null、およびその他のスカラー値を深くコピーし、ネイティブではない関数のプロパティも深くコピーします(これは非常に一般的ではありませんが、可能です)。(効率のために、配列に数値以外のプロパティをコピーすることは試みません。)

function deepClone (item) {
  if (Array.isArray(item)) {
    var newArr = [];
    for (var i = item.length; i-- > 0;) {
      newArr[i] = deepClone(item[i]);
    }
    return newArr;
  }
  if (typeof item === 'function' && !(/\(\) \{ \[native/).test(item.toString())) {
    var obj;
    eval('obj = '+ item.toString());
    for (var k in item) {
      obj[k] = deepClone(item[k]);
    }
    return obj;
  }
  if (item && typeof item === 'object') {
    var obj = {};
    for (var k in item) {
      obj[k] = deepClone(item[k]);
    }
    return obj;
  }
  return item;
}

3

新しいECMAScript 6 Object.assignメソッドを使用します。

let oldObject = [1,3,5,"test"];
let newObject = Object.assign({}, oldObject);

このメソッドの最初の引数は更新する配列です。新しいオブジェクトを作成するため、空のオブジェクトを渡します。

この構文を使用することもできます。これは同じですが短いものです。

let newObject = [...oldObject];

これらのアプローチは、配列および配列内のオブジェクトの参照のみをコピーし、これらの新しいコピーを作成しないことに注意してください。これが多次元構造で壊れると期待してください。
Ben Wheeler

2

多次元配列を複製する単純な再帰的なArrayメソッドを発明できます。ネストされた配列内のオブジェクトは、ソース配列内の対応するオブジェクトへの参照を保持しますが、配列は保持しません。

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};

var arr = [ 1, 2, 3, 4, [ 1, 2, [ 1, 2, 3 ], 4 , 5], 6 ],
    brr = arr.clone();
brr[4][2][1] = "two";
console.log(JSON.stringify(arr));
console.log(JSON.stringify(brr));


2

JavaScriptでは、配列とオブジェクトのコピーが元の値を変更するため、ディープコピーがこれに対するソリューションです。

ディープコピーとは、実際に新しい配列を作成して値をコピーすることを意味します。これは、元の配列に影響が及ぶことはないためです。

JSON.parseそしてJSON.stringifyディープコピーへの最善かつ簡単な方法です。このJSON.stringify()メソッドは、JavaScript値をJSON.parse()JSON文字列に変換します。このメソッドは、JSON文字列を解析し、JavaScript値または文字列で記述されたオブジェクトを構築します。

//ディープクローン

let a = [{ x:{z:1} , y: 2}];
let b = JSON.parse(JSON.stringify(a));
b[0].x.z=0

console.log(JSON.stringify(a)); //[{"x":{"z":1},"y":2}]
console.log(JSON.stringify(b)); // [{"x":{"z":0},"y":2}]

詳しくはこちらをお読みください


1
これが最良の解決策です。ありがとうございました。
ニコライ

1

jQueryを使って:

var target= [];
$.each(source, function() {target.push( $.extend({},this));});

1

次のコードは、オブジェクトと配列のディープコピーを再帰的に実行します

function deepCopy(obj) {
if (Object.prototype.toString.call(obj) === '[object Array]') {
    var out = [], i = 0, len = obj.length;
    for ( ; i < len; i++ ) {
        out[i] = arguments.callee(obj[i]);
    }
    return out;
}
if (typeof obj === 'object') {
    var out = {}, i;
    for ( i in obj ) {
        out[i] = arguments.callee(obj[i]);
    }
    return out;
}
return obj;
}

ソース


arguments.callee厳格モードでは使用できず、それ以外の場合はパフォーマンスの問題があります。
Brett Zamir、2016年

1

JavaScriptでディープクローンを作成するエレガントな方法

https://mootools.net/core/docs/1.6.0/Types/Object

https://scotch.io/bar-talk/copying-objects-in-javascript

1)オブジェクトを複製するためのバニラJavaScriptメソッド

2)オブジェクトをディープクローンするJSONライブラリの巧妙な活用

3)jQueryの$ .extend()関数を使用する

4)Mootoolsのclone()関数を使用してオブジェクトを複製する


0

Object.createは、すべての最新のブラウザーでサポートされている、主に使用するJavaScript構造をディープクローンする一般的な方法をなんとか書いたと思います。コードは次のとおりです。

function deepClone (item) {
  if (Array.isArray(item)) {
    var newArr = [];

    for (var i = item.length; i-- !== 0;) {
      newArr[i] = deepClone(item[i]);
    }

    return newArr;
  }
  else if (typeof item === 'function') {
    eval('var temp = '+ item.toString());
    return temp;
  }
  else if (typeof item === 'object')
    return Object.create(item);
  else
    return item;
}

Object.createitemオブジェクトのプロトタイプとして扱われますが、クローン化とは異なります。item変更された場合、変更はその「クローン」に反映され、その逆も同様です。このアプローチは機能しません。
Brett Zamir

0

オブジェクトの複製についても、ECMAScript 6を提案するだけでしたreduce()

const newArray=myArray.reduce((array, element)=>array.push(Object.assign({}, element)), []);

しかし率直に言って、私は@dinodsaurusの答えがさらに好きです。私はこのバージョンを別のオプションとしてここに配置していますが、個人的にはmap()@dinodsaurusの提案に従って使用します。



0
       var game_popularity = [
            { game: "fruit ninja", popularity: 78 },
            { game: "road runner", popularity: 20 },
            { game: "maze runner", popularity: 40 },
            { game: "ludo", popularity: 75 },
            { game: "temple runner", popularity: 86 }
        ];
        console.log("sorted original array before clonning");
        game_popularity.sort((a, b) => a.popularity < b.popularity);
        console.log(game_popularity);


        console.log("clone using object assign");
        const cl2 = game_popularity.map(a => Object.assign({}, a));
        cl2[1].game = "clash of titan";
        cl2.push({ game: "logan", popularity: 57 });
        console.log(cl2);


        //adding new array element doesnt reflect in original array
        console.log("clone using concat");
        var ph = []
        var cl = ph.concat(game_popularity);

        //copied by reference ?
        cl[0].game = "rise of civilization";

        game_popularity[0].game = 'ping me';
        cl.push({ game: "angry bird", popularity: 67 });
        console.log(cl);

        console.log("clone using ellipses");
        var cl3 = [...game_popularity];
        cl3.push({ game: "blue whale", popularity: 67 });
        cl3[2].game = "harry potter";
        console.log(cl3);

        console.log("clone using json.parse");
        var cl4 = JSON.parse(JSON.stringify(game_popularity));
        cl4.push({ game: "home alone", popularity: 87 });
        cl4[3].game ="lockhead martin";
        console.log(cl4);

        console.log("clone using Object.create");
        var cl5 = Array.from(Object.create(game_popularity));
        cl5.push({ game: "fish ville", popularity: 87 });
        cl5[3].game ="veto power";
        console.log(cl5);


        //array function
        console.log("sorted original array after clonning");
        game_popularity.sort((a, b) => a.popularity < b.popularity);
        console.log(game_popularity);


        console.log("Object.assign deep clone object array");
        console.log("json.parse deep clone object array");
        console.log("concat does not deep clone object array");
        console.log("ellipses does not deep clone object array");
        console.log("Object.create does not deep clone object array");


        Output:


        sorted original array before clonning
        [ { game: 'temple runner', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'ludo', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 } ]
        clone using object assign
        [ { game: 'temple runner', popularity: 86 },
        { game: 'clash of titan', popularity: 78 },
        { game: 'ludo', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'logan', popularity: 57 } ]
        clone using concat
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'ludo', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'angry bird', popularity: 67 } ]
        clone using ellipses
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'blue whale', popularity: 67 } ]
        clone using json.parse
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'lockhead martin', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'home alone', popularity: 87 } ]
        clone using Object.create
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'veto power', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'fish ville', popularity: 87 } ]
        sorted original array after clonning
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'veto power', popularity: 40 },
        { game: 'road runner', popularity: 20 } ]

        Object.assign deep clone object array
        json.parse deep clone object array
        concat does not deep clone object array
        ellipses does not deep clone object array
        Object.create does not deep clone object array
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.