Inhaltsverzeichnis
Prämisse: Der Unterschied zwischen primitiven Datentypen und Objekttypen beim Zuweisen von Werten
Was ist flache Kopie?
So implementieren Sie eine flache Kopie
Deep Copy und ihre Implementierung
Heim Web-Frontend js-Tutorial So implementieren Sie tiefe und flache Kopien von Arrays und Objekten

So implementieren Sie tiefe und flache Kopien von Arrays und Objekten

Oct 09, 2017 am 10:04 AM
对象 数组

Prämisse: Der Unterschied zwischen primitiven Datentypen und Objekttypen beim Zuweisen von Werten

Die Datentypen von JavaScript sind in primitive Datentypen und Objekttypen unterteilt. Beide werden auf unterschiedliche Weise im Gedächtnis abgelegt, wodurch sich Unterschiede in der Zuordnung ergeben. Nehmen wir jeweils eine Kastanie

  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]
Nach dem Login kopieren

Aus der Kastanie oben ist ersichtlich: Wenn dem ursprünglichen Datentyp ein Wert zugewiesen wird, werden nach der Zuweisung die beiden Werte angegeben ​​sind einfach gleich, nicht Gegenseitiger Einfluss; Der Objekttyp gibt die Referenzadresse der Originaldaten an, sodass sich die alten und neuen Daten gegenseitig beeinflussen, da es sich im Wesentlichen um dasselbe Datenobjekt handelt , z als Array in Shangli

Was ist flache Kopie?

Wie der Name schon sagt, handelt es sich bei der flachen Kopie um eine oberflächliche Kopiermethode. Wenn der Attributwert ein Objekttyp ist, wird nur der Verweis auf die Objektdaten kopiert, was zur Folge hat Auch wenn alte und neue Daten nicht vollständig getrennt sind, wirken sie sich gegenseitig aus. Nehmen wir ein anderes Beispiel...


  //测试数据
  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}]
Nach dem Login kopieren

In der Kastanie ist Array2 ein flaches Kopierobjekt von Array1. Die Array-Elemente sind von primitiven Datentypen und haben keine Auswirkungen einander (array1[ 0]), aber array1[3] ist ein Objekttyp und beeinflusst sich weiterhin gegenseitig.

So implementieren Sie eine flache Kopie

  1. Array.concat() oder array.slice() in Shangli ist eine spezielle Implementierung einer flachen Kopie von Array-Weg.

  2. Wie kann ich es selbst umsetzen? Wäre es nicht ausreichend, jedes Attribut des Objekts/Arrays zu durchlaufen und es dann einem neuen Objekt zuzuweisen? Die folgende Implementierung

  //实现浅拷贝
  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   原数据也被修改
Nach dem Login kopieren

Deep Copy und ihre Implementierung

Von Sie können im Grunde verstehen, dass eine tiefe Kopie eine „vollständige“ Kopie ist. Nach dem Kopieren sind die alten und neuen Daten vollständig getrennt und teilen sich nicht mehr die Attributwerte des Objekttyps sich gegenseitig beeinflussen.

Implementierungsmethode:

  1. Knifflige Methode 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}]  未受到影响
Nach dem Login kopieren

 Hinweis: Diese Methode kann keine Objekte tief kopieren, deren Attributwerte Funktionen sind. Sie können es selbst versuchen

 2. Implementieren Sie Deep Copy

 Flache Kopie wurde durchgeführt Wenn man darüber nachdenkt, sollte das Ergebnis beim Zuweisen des Objekttyp-Attributwerts keine vollständige Trennung sein, daher müssen wir die Art und Weise des Kopierens des Objekttyp-Attributwerts ändern und erneut eine tiefe Kopie aufrufen Realisieren Sie die tiefe Kopie wie folgt:

//实现深拷贝
function deepCopy( target ){
  if(typeof target !== 'object') return ;
  //判断目标类型,来创建返回值
  var newObj = target instanceof Array ? [] : {};

  for(var item in target){
    //只复制元素自身的属性,不复制原型链上的
    if(target.hasOwnProperty(item)){
      newObj[item] = typeof target[item] == 'object' ? deepCopy(target[item]) : target[item]  //判断属性值类型    }
  }

  return newObj
}

//测试
var test = [1,'a',{name:'lei',age:18}];

var copy2 = deepCopy(test);
copy2[2].name = 'zhang'

console.log(test);  ////[1,'a',{name:'lei',age:18}]  未受到影响
Nach dem Login kopieren

Zusammenfassung

Stellen Sie sicher, dass Sie die Gründe für die flache Kopie verstehen: Beim Kopieren von Objekttypdaten werden die Referenzadresse und dieselben Daten kopiert Das Objekt wird weiterhin verwendet. Die Methode zum Implementieren einer tiefen Kopie besteht darin, die Attributwerte des Objekttyps rekursiv tief zu kopieren, um eine direkte Zuweisung zu vermeiden.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie tiefe und flache Kopien von Arrays und Objekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie entferne ich doppelte Elemente mithilfe einer foreach-Schleife aus einem PHP-Array? Wie entferne ich doppelte Elemente mithilfe einer foreach-Schleife aus einem PHP-Array? Apr 27, 2024 am 11:33 AM

Die Methode zur Verwendung einer foreach-Schleife zum Entfernen doppelter Elemente aus einem PHP-Array ist wie folgt: Durchlaufen Sie das Array und löschen Sie es, wenn das Element bereits vorhanden ist und die aktuelle Position nicht das erste Vorkommen ist. Wenn beispielsweise in den Datenbankabfrageergebnissen doppelte Datensätze vorhanden sind, können Sie diese Methode verwenden, um diese zu entfernen und Ergebnisse ohne doppelte Datensätze zu erhalten.

Die Kunst des PHP Array Deep Copy: Mit verschiedenen Methoden eine perfekte Kopie erzielen Die Kunst des PHP Array Deep Copy: Mit verschiedenen Methoden eine perfekte Kopie erzielen May 01, 2024 pm 12:30 PM

Zu den Methoden zum tiefen Kopieren von Arrays in PHP gehören: JSON-Kodierung und -Dekodierung mit json_decode und json_encode. Verwenden Sie array_map und clone, um tiefe Kopien von Schlüsseln und Werten zu erstellen. Verwenden Sie Serialize und Deserialize für die Serialisierung und Deserialisierung.

PHP-Array-Schlüsselwertumdrehen: Vergleichende Leistungsanalyse verschiedener Methoden PHP-Array-Schlüsselwertumdrehen: Vergleichende Leistungsanalyse verschiedener Methoden May 03, 2024 pm 09:03 PM

Der Leistungsvergleich der PHP-Methoden zum Umdrehen von Array-Schlüsselwerten zeigt, dass die Funktion array_flip() in großen Arrays (mehr als 1 Million Elemente) eine bessere Leistung als die for-Schleife erbringt und weniger Zeit benötigt. Die for-Schleifenmethode zum manuellen Umdrehen von Schlüsselwerten dauert relativ lange.

Wie konvertiere ich ein MySQL-Abfrageergebnisarray in ein Objekt? Wie konvertiere ich ein MySQL-Abfrageergebnisarray in ein Objekt? Apr 29, 2024 pm 01:09 PM

So konvertieren Sie ein MySQL-Abfrageergebnis-Array in ein Objekt: Erstellen Sie ein leeres Objekt-Array. Durchlaufen Sie das resultierende Array und erstellen Sie für jede Zeile ein neues Objekt. Verwenden Sie eine foreach-Schleife, um die Schlüssel-Wert-Paare jeder Zeile den entsprechenden Eigenschaften des neuen Objekts zuzuweisen. Fügt dem Objektarray ein neues Objekt hinzu. Schließen Sie die Datenbankverbindung.

Anwendung der PHP-Array-Gruppierungsfunktion bei der Datensortierung Anwendung der PHP-Array-Gruppierungsfunktion bei der Datensortierung May 04, 2024 pm 01:03 PM

Die PHP-Funktion array_group_by kann Elemente in einem Array basierend auf Schlüsseln oder Abschlussfunktionen gruppieren und ein assoziatives Array zurückgeben, wobei der Schlüssel der Gruppenname und der Wert ein Array von Elementen ist, die zur Gruppe gehören.

Best Practices für Deep Copying von PHP-Arrays: Entdecken Sie effiziente Methoden Best Practices für Deep Copying von PHP-Arrays: Entdecken Sie effiziente Methoden Apr 30, 2024 pm 03:42 PM

Die beste Vorgehensweise zum Durchführen einer Array-Deep-Kopie in PHP besteht darin, json_decode(json_encode($arr)) zu verwenden, um das Array in einen JSON-String zu konvertieren und ihn dann wieder in ein Array umzuwandeln. Verwenden Sie unserialize(serialize($arr)), um das Array in eine Zeichenfolge zu serialisieren und es dann in ein neues Array zu deserialisieren. Verwenden Sie den RecursiveIteratorIterator, um mehrdimensionale Arrays rekursiv zu durchlaufen.

Was ist der Unterschied zwischen Arrays und Objekten in PHP? Was ist der Unterschied zwischen Arrays und Objekten in PHP? Apr 29, 2024 pm 02:39 PM

In PHP ist ein Array eine geordnete Sequenz, und auf Elemente wird über einen Index zugegriffen. Ein Objekt ist eine Entität mit Eigenschaften und Methoden, die über das Schlüsselwort new erstellt werden. Der Array-Zugriff erfolgt über einen Index, der Objektzugriff über Eigenschaften/Methoden. Es werden Array-Werte und Objektreferenzen übergeben.

Praxis der mehrdimensionalen Sortierung von PHP-Arrays: von einfachen bis hin zu komplexen Szenarien Praxis der mehrdimensionalen Sortierung von PHP-Arrays: von einfachen bis hin zu komplexen Szenarien Apr 29, 2024 pm 09:12 PM

Die mehrdimensionale Array-Sortierung kann in Einzelspaltensortierung und verschachtelte Sortierung unterteilt werden. Bei der Einzelspaltensortierung kann die Funktion array_multisort() zum Sortieren nach Spalten verwendet werden. Bei der verschachtelten Sortierung ist eine rekursive Funktion erforderlich, um das Array zu durchlaufen und zu sortieren. Zu den praktischen Beispielen gehören die Sortierung nach Produktname und die Sortierung von Verbindungen nach Verkaufsmenge und Preis.

See all articles