Copier les valeurs d'un tableau
P粉002546490
2023-08-20 12:42:44
<p>Lors de la copie d'un tableau vers un autre en JavaScript : </p>
<pre class="brush:php;toolbar:false;">var arr1 = ['a','b','c'];
vararr2 = arr1;
arr2.push('d'); // Maintenant, arr1 = ['a','b','c','d']</pre>
<p>J'ai réalisé que <code>arr2</code> faisait référence au même tableau que <code>arr1</code>, et non à un nouveau tableau séparé. Comment copier un tableau pour obtenir deux tableaux distincts ? </p>
En Javascript, la technique de copie profonde dépend des éléments du tableau. Commençons ici.
Trois types d'éléments
Les éléments peuvent être : des valeurs littérales, des structures littérales ou des prototypes.
À partir de ces éléments, nous pouvons créer trois types de tableaux.
La technologie de copie profonde dépend de ces trois types de tableaux
En fonction du type d'éléments du tableau, nous pouvons utiliser diverses techniques pour effectuer des copies approfondies.
Technologie de copie approfondie
Benchmarks
https://www.measurethat.net/Benchmarks/Show/17502/0/deep-copy-comparison
Tableau littéral (type 1)
Des performances maximales peuvent être obtenues en utilisant
[ ...myArray ]
、myArray.splice(0)
、myArray.slice()
和myArray.concat()
技术来深拷贝只包含字面值(布尔值、数字和字符串)的数组;其中在Chrome中,slice()
的性能最高,在Firefox中,扩展运算符...
.Tableau de valeurs littérales (type 1) et tableau de structures littérales (type 2)
Vous pouvez utiliser la technique
JSON.parse(JSON.stringify(myArray))
pour copier en profondeur des valeurs littérales (valeurs booléennes, nombres, chaînes) et des structures littérales (tableaux, objets), mais les objets prototypes ne peuvent pas être copiés.Tous les tableaux (type 1, type 2, type 3)
cloneDeep(myArray)
de Lo-dash ou leextend de jQuery
technique pour copier en profondeur des tableaux de tous types. Parmi eux, la technologiecloneDeep(myArray)
或 jQuery 的extend(true, [], myArray)
技术来深拷贝所有类型的数组。其中Lodash的cloneDeep()
(true, [], myArray)cloneDeep()
de Lodash est la plus performante.cloneDeep()
,但高于extend(true)
.Alors pour répondre à cette question...
Question
Réponse
Parce que
arr1
是一个包含字面值(布尔值、数字或字符串)的数组,你可以使用上面讨论的任何深拷贝技术,其中slice()
和扩展运算符...
a les performances les plus élevées.Utilisez ceci :