配列とオブジェクトの深いコピーと浅いコピーを実装する方法
前提:値を代入する際のプリミティブデータ型とオブジェクト型の違い
JavaScriptのデータ型はプリミティブデータ型とオブジェクト型に分けられます。この 2 つはメモリ内で異なる方法で保存されるため、割り当てに違いが生じます。それぞれ栗を取ってみましょう
var x = 1; var y = x; //y获得了和x同样的值 y = 2; console.log(x); // 1 var m = [1,2]; //m存放的是指向[1,2]这个数组对象的引用地址 var n = m; //n也获得 [1,2]数组对象的引用地址 n[0] = 3; console.log(m); //[3,2]
上の栗からわかるように、元のデータ型が割り当てられると、割り当て後に実際のデータ値が与えられ、2 つの値はまったく同じであり、影響しません。オブジェクトタイプは元のデータの参照アドレスとして与えられますが、Shangli の配列のように、古いデータと新しいデータは本質的に同じデータオブジェクトであるため、相互に影響します
浅いコピーですか?その名の通り、浅いコピーは表面的なコピー方法で、属性値がオブジェクト型の場合、オブジェクトデータへの参照のみがコピーされるため、古いデータと新しいデータが完全に分離されず影響を受けます。お互い。別の例を見てみましょう...
//测试数据 var array1 = ['a',1,true,{name:'lei',age:18}]; //concat() slice() 实现浅拷贝 var array2 = array1.concat() //修改拷贝后的数据 array2[0] = 'b'; //array1[0]是原始数据类型 所以是直接赋值的 array2[3].name = 'zhang'; //array1[3]是对象数据类型 所以拷贝的是对象的引用,其实还是和原数组使用同一对象 console.log(array1); // ['a',1,true,{name:'zhang',age:18}]
この例では、array2 は array1 の浅いコピー オブジェクトであり、配列要素は元のデータ型であり、相互に影響しません (array1[0])。ただし、array1[3] ] はオブジェクト タイプであり、引き続き相互に影響します。 浅いコピーの実装方法
- Shangli の array.concat() または array.slice() は、配列の浅いコピーを実装する特別な方法です。
- 自分で実装するにはどうすればよいですか?オブジェクト/配列の各属性をトラバースして、それを新しいオブジェクトに割り当てるだけで十分ではないでしょうか? 実装は次のとおりです
//实现浅拷贝 function shallowCopy( target ){ if(typeof target !== 'object') return ; //判断目标类型,来创建返回值 var newObj = target instanceof Array ? [] : {}; for(var item in target){ //只复制元素自身的属性,不复制原型链上的 if(target.hasOwnProperty(item)){ newObj[item] = target[item] } } return newObj } //测试 var test = [1,'a',{name:'lei',age:18}]; var copy = shallowCopy(test); console.log(copy[2].name); //lei copy[2].name = 'zhang'; console.log(test[2].name); //zhang 原数据也被修改
ログイン後にコピー深いコピーとその実装
浅いコピーの説明から、次のようになります。基本的にディープコピーは「完全な」コピーであることを理解してください。コピー後、古いデータと新しいデータは完全に分離され、オブジェクトタイプの属性値を共有しなくなり、相互に影響を与えなくなります。
実装方法:
- トリッキーなメソッド JSON.parse(JSON.stringify(Obj))
- 注: このメソッドは、属性値が関数であるオブジェクトをディープコピーすることはできません。自分で試すことができます。
var test = [1,'a',{name:'lei',age:18}]; var copy1 = JSON.parse(JSON.stringify(test)); //特殊方式 console.log(copy1); copy1[2].name = 'zhang' console.log(test); //[1,'a',{name:'lei',age:18}] 未受到影响
ログイン後にコピー2. ディープコピーの実装
考えてみれば、オブジェクトタイプの属性値を割り当てる際に、結果が完全な分離にならないはずなので、オブジェクトのコピー方法を変更する必要があります。属性値を入力し、その上で再度 deep を呼び出します。これにより、次のようにディープ コピーが実現されます。同じデータ オブジェクトが使用されるため、ディープ コピーが実装されます。この方法では、オブジェクト タイプの属性値を再帰的にディープ コピーして、直接の割り当てを回避します。
以上が配列とオブジェクトの深いコピーと浅いコピーを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









foreach ループを使用して PHP 配列から重複要素を削除する方法は次のとおりです。配列を走査し、要素がすでに存在し、現在の位置が最初に出現しない場合は、要素を削除します。たとえば、データベース クエリの結果に重複レコードがある場合、このメソッドを使用してそれらを削除し、重複レコードのない結果を取得できます。

PHP で配列をディープ コピーする方法には、json_decode と json_encode を使用した JSON エンコードとデコードが含まれます。 array_map と clone を使用して、キーと値のディープ コピーを作成します。シリアル化と逆シリアル化には、serialize と unserialize を使用します。

PHP の配列キー値の反転メソッドのパフォーマンスを比較すると、array_flip() 関数は、大規模な配列 (100 万要素以上) では for ループよりもパフォーマンスが良く、所要時間が短いことがわかります。キー値を手動で反転する for ループ方式は、比較的長い時間がかかります。

MySQL クエリ結果の配列をオブジェクトに変換する方法は次のとおりです。 空のオブジェクト配列を作成します。結果の配列をループし、行ごとに新しいオブジェクトを作成します。 foreach ループを使用して、各行のキーと値のペアを新しいオブジェクトの対応するプロパティに割り当てます。新しいオブジェクトをオブジェクト配列に追加します。データベース接続を閉じます。

PHP の array_group_by 関数は、キーまたはクロージャ関数に基づいて配列内の要素をグループ化し、キーがグループ名、値がグループに属する要素の配列である連想配列を返すことができます。

PHP で配列のディープ コピーを実行するためのベスト プラクティスは、 json_decode(json_encode($arr)) を使用して配列を JSON 文字列に変換し、それから配列に戻すことです。 unserialize(serialize($arr)) を使用して配列を文字列にシリアル化し、それを新しい配列に逆シリアル化します。 RecursiveIteratorIterator を使用して、多次元配列を再帰的に走査します。

PHP では、配列は順序付けられたシーケンスであり、要素はインデックスによってアクセスされます。オブジェクトは、new キーワードによって作成されたプロパティとメソッドを持つエンティティです。配列へのアクセスはインデックス経由で、オブジェクトへのアクセスはプロパティ/メソッド経由で行われます。配列値が渡され、オブジェクト参照が渡されます。

多次元配列のソートは、単一列のソートとネストされたソートに分類できます。単一列のソートでは、array_multisort() 関数を使用して列ごとにソートできますが、ネストされたソートでは、配列を走査してソートするための再帰関数が必要です。具体的な例としては、製品名による並べ替えや、売上数量や価格による化合物の並べ替えなどがあります。
