Erstellen einer tiefen Kopie mit structuredClone
Die moderne Art, ein Array in JavaScript tief zu kopieren, ist die Verwendung von structuredClone :
array2 = structuredClone(array1);
Diese Funktion ist jedoch relativ neu (Chrome 98, Firefox 94) und ist derzeit nur verfügbar für etwa 40 % der Benutzer, so dass es ohne Polyfill noch nicht produktionsreif ist.
Als Alternative können Sie eine der unten aufgeführten, gut unterstützten JSON-basierten Lösungen verwenden.
Erstellen einer tiefen Kopie mit JSON.parse
Eine allgemeine Lösung, die alle möglichen Objekte innerhalb eines Arrays von Objekten berücksichtigt, ist möglicherweise nicht möglich. Das heißt, wenn Ihr Array Objekte enthält die JSON-serialisierbaren Inhalt haben (keine Funktionen, keine Number.POSITIVE_INFINITY
usw.) ist eine einfache Möglichkeit zur Vermeidung von Schleifen, die allerdings mit Leistungseinbußen verbunden ist, diese reine Vanilla-Einzellösung.
let clonedArray = JSON.parse(JSON.stringify(nodesArray))
Zusammenfassend lässt sich sagen, dass der Hauptvorteil dieses Ansatzes darin besteht, dass auch der Inhalt des Arrays geklont wird, nicht nur das Array selbst. Die primären Nachteile sind die Beschränkung auf JSON-serialisierbare Inhalte und die ~30-mal langsamere Leistung als die Spread-Methode.
Wenn Sie flache Objekte im Array haben und IE6 akzeptabel ist, ist es besser, den Spread-Operator in Kombination mit dem Array-Operator .map zu verwenden. Für eine zwei Ebenen tiefe Situation (wie das Array im Anhang unten):
clonedArray = nodesArray.map(a => {return {...a}})
Dafür gibt es zwei Gründe: 1) Es ist viel, viel schneller (siehe unten für einen Benchmark-Vergleich) und es erlaubt auch jedes gültige Objekt in Ihrem Array.
*Anhang: Die Quantifizierung der Leistung basiert auf dem millionenfachen Klonen dieses Arrays von Objekten:
[{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic1.jpg?raw=true', id: '1', isFavorite: false}, {url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic2.jpg?raw=true', id: '2', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic3.jpg?raw=true', id: '3', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic4.jpg?raw=true', id: '4', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic5.jpg?raw=true', id: '5', isFavorite: true},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic6.jpg?raw=true', id: '6', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic7.jpg?raw=true', id: '7', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic8.jpg?raw=true', id: '8', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic9.jpg?raw=true', id: '9', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic10.jpg?raw=true', id: '10', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic11.jpg?raw=true', id: '11', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic12.jpg?raw=true', id: '12', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic13.jpg?raw=true', id: '13', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic14.jpg?raw=true', id: '14', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic15.jpg?raw=true', id: '15', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic16.jpg?raw=true', id: '16', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic17.jpg?raw=true', id: '17', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic18.jpg?raw=true', id: '18', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic19.jpg?raw=true', id: '19', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic20.jpg?raw=true', id: '20', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic21.jpg?raw=true', id: '21', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic22.jpg?raw=true', id: '22', isFavorite: false},{url: 'https://github.com/bobziroll/scrimba-react-bootcamp-images/blob/master/pic23.jpg?raw=true', id: '23', isFavorite: false}]
entweder mit:
let clonedArray = JSON.parse(JSON.stringify(nodesArray))
oder:
clonedArray = nodesArray.map(a => {return {...a}})
Der Map/Spread-Ansatz benötigte 0,000466 ms pro Durchgang und JSON.parse und JSON.stringify 0,014771 ms pro Durchgang.