Javascript fournit plusieurs types différents de tableaux (au moins 5 types).
var type1 = ['a', 'b']; // Array of Strings
var type2 = [1, 2]; // Array of Numbers
var type3 = [['a'], ['b']]; // Array of Arrays
var type4 = [{a: 'a'} , {b: 'b'}]; // Array of Object-Literals
var type5 = [{a: function () {}}, {b: function () {}}]; // Array of Objects
Selon le type de tableau, diverses techniques (comme .splice, .concat, JSON, $.extend, etc.) peuvent être utilisées pour copier profondément un tableau.
myArray.splice(0);
myArray.concat();
JSON.parse(JSON.stringify(myArray));
$.extend(true, [], myArray); // jQuery
_.extend(); // underscore
_.cloneDeep(); // lo-dash
Cependant, la plupart des techniques ne permettent pas de copier en profondeur tous les types de tableaux.
Prise en charge de la copie profonde pour diverses techniques (par type de tableau)
- Splice et Concat peuvent être utilisés pour copier en profondeur un tableau de chaînes de caractères et un tableau de nombres, Splice étant plus performant que Concat. http://jsperf.com/duplicate-array-slice-vs-concat/3
- JSON.parse(JSON.stringify()) peut être utilisé pour copier en profondeur un tableau de chaînes de caractères, un tableau de nombres, un tableau de matrices et un tableau de littéraux d'objets, mais pas un tableau d'objets prototypes.
- jQuery $.extend() peut être utilisé pour copier en profondeur tout type de tableau. D'autres bibliothèques, comme underscore et lo-dash, offrent des fonctions de copie profonde similaires, mais leurs performances sont également plus faibles. Plus surprenant, $.extend a également de meilleures performances que JSON.parse(JSON.stringify()). http://jsperf.com/js-deep-copy/2 ,
Copie profonde de tout type de tableau (sans bibliothèque tierce) :
Et pour les développeurs qui hésitent à utiliser des bibliothèques tierces (comme jQuery), la fonction personnalisée suivante peut être utilisée à la place. Elle offre des performances plus rapides que $.extend, et copie en profondeur tous les types de tableaux.
function copy(o) {
var out, v, key;
out = Array.isArray(o) ? [] : {};
for (key in o) {
v = o[key];
out[key] = (typeof v === "object") ? copy(v) : v;
}
return out;
}
4 votes
Il semble qu'actuellement, dans Chrome 53 et Firefox 48, les performances sont bonnes pour
slice
ysplice
opérations et nouvel opérateur d'épandage etArray.from
ont une mise en œuvre beaucoup plus lente. Regardez perfjs.fnfo0 votes
jsben.ch/#/wQ9RU <= ce benchmark donne un aperçu des différentes manières de copier un tableau.
0 votes
jsperf.com/flat-array-copy
0 votes
Pour ce tableau (qui contient des chaînes de caractères primitives), vous pouvez utiliser
var arr2 = arr1.splice();
pour effectuer une copie profonde, mais cette technique ne fonctionnera pas si les éléments de votre tableau contiennent des structures littérales (c'est à dire[]
ou{}
) ou des objets prototypes (c'est-à-direfunction () {}
,new
etc). Voir ma réponse ci-dessous pour d'autres solutions.41 votes
Nous sommes en 2017, vous pourriez donc envisager d'utiliser les fonctionnalités ES6 :
let arr2 = [...arr1];
developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/0 votes
Tout ce que vous devez faire est ; var arr2 = new Array(arr2). Regardez ma réponse ci-dessous. lien
2 votes
Eh bien, quand vous dites
a = b;
vous demandez en fait au programme de pointer dans les deux cas vers un même lien symbolique dans la mémoire vive. Et quand une valeur de ce lien symbolique est modifiée, cela affectea
yb
... Donc, si vous utilisez un opérateur d'étalementa= [...b];
créera un lien symbolique supplémentaire vers un autre emplacement de la mémoire vive et vous pourrez alors manipuler les éléments suivantsa
yb
indépendamment.0 votes
Let oldArray = [1, 2, 3, 4, 5] ; let newArray = oldArray.slice() ; console.log({newArray}) ;