2010-09-23 6 views
52

Ceci est mon code:Existe-t-il une méthode pour cloner un tableau dans jQuery?

var a=[1,2,3] 
b=$.clone(a) 
alert(b) 

N'a pas jQuery ont une méthode 'clone'? Comment puis-je cloner un tableau en utilisant jQuery?

+0

Pour voir le clonage tableau Multidimensional - http://stackoverflow.com/questions/2294703/multidimensional-array-cloning-using -javascript – vsync

+0

Oui. jQuery a une méthode clone et s'étend également avec le paramètre deep défini sur true. Voir http://api.jquery.com/clone/ et http://api.jquery.com/jquery.extend/ L'option rapide et sale pour les petites quantités de données est d'utiliser JSON.parse (JSON.stringify (original)). Pour de grandes quantités de données, peut-être que vous ne devriez pas être en train de cloner ?! – podperson

+0

Utiliser l'opérateur de propagation – zloctb

Répondre

137

Utilisez simplement Array.prototype.slice.

a = [1]; 
b = a.slice(); 

jsFiddle - http://jsfiddle.net/neoswf/ebuk5/

+1

Ceci est synonyme de 'tranche (0)'? –

+0

@Peter Ajtai - ouais. –

+7

Merci meder. ....... La seule chose à surveiller, c'est que les tableaux sont des objets, donc vous pouvez attacher des propriétés et des méthodes ... comme 'var a = [1,2,3]; a.foo = function() {alert (this); }; 'Avec' slice() 'toutes les propriétés et méthodes attachées ne sont pas copiées, donc vous ne pourriez pas faire' b.foo() '... Je ne fais qu'appeler, puisque' .clone() 'de jQuery ne inclure une option de copie profonde. Par exemple: http://jsfiddle.net/B2LQL/ .......... Mais c'est à peu près un cas d'angle dans le contexte de cette question. –

1

essayer

if (!Array.prototype.clone) { 
    Array.prototype.clone = function() { 
     var arr1 = new Array(); 
     for (var property in this) { 
      arr1[property] = typeof (this[property]) == 'object' ? this[property].clone() : this[property] 
     } 
     return arr1; 
    }​ 
} 

utilisation comme

var a = [1, 2, 3] 
b = a; 
a.push(4) 
alert(b); // alerts [1,2,3,4] 
//---------------/// 
var a = [1, 2, 3] 
b = a.clone(); 
a.push(4) 
alert(b); // alerts [1,2,3]​ 
+0

Ceci est juste au cas où vous avez joint d'autres propriétés au tableau en plus des valeurs dans le tableau? (par opposition à simplement utiliser 'tranche (0)')? –

+0

@Peter - 'slice (0)' est bon. Je montre juste une autre façon de le résoudre. ;) – Reigel

+0

Grand homme! Merci! – neoswf

6

changement

b = $. Clone (a) à b = $ (this) .clone (a) mais un peu de temps ne fonctionnent pas

mais est rapporté

http://www.fusioncube.net/index.php/jquery-clone-bug-in-internet-explorer

Solution vous utilisez la fonction simple clone de javascript intégré

var a=[1,2,3]; 
b=clone(a); 
alert(b); 

function clone(obj){ 
    if(obj == null || typeof(obj) != 'object') 
     return obj; 
    var temp = obj.constructor(); 
    for(var key in obj) 
     temp[key] = clone(obj[key]); 
    return temp; 
} 

-ConroyP

Une alternative est

// Shallow copy 
    var b = jQuery.extend({}, a); 

    // Deep copy 
    var b = jQuery.extend(true, {}, a); 

-John Resig

Vérifier poste similaire

+1

Japan- Extend est destiné aux objets. Ur premier func était également destiné à Object. – neoswf

+0

Étendre fonctionne très bien pour un tableau, il suffit de changer l'objet vide {} dans un tableau vide []. –

1

Une autre option est utiliser Array.concat:

var a=[1,2,3] 
var b=[].concat(a); 
+0

Cela ne fait pas l'affaire – neoswf

+0

Fondamentalement, le même problème que l'utilisation de tranche. – podperson

10

Qu'en est-il du jQuery.merge?

copy = $.merge([], a); 
+1

Ceci fait également une copie peu profonde, et est donc équivalente à la réponse acceptée. – rych

+0

@rych Ceci n'est pas équivalent, car il fonctionne également sur des objets de type tableau qui n'ont pas de méthode .slice (par exemple, NamedNodeMap). – janek37

4

Voilà comment je l'ai fait:

var newArray = JSON.parse(JSON.stringify(orgArray)); 

cela va créer une nouvelle copie en profondeur ne sont pas liées à la première (et non une copie superficielle).

aussi évidemment cela ne clonera pas les événements et les fonctions, mais la bonne chose que vous pouvez le faire en une seule ligne et il peut être utilisé pour n'importe quel roi d'objet (tableaux, chaînes, nombres, objets ...)

+1

Ce n'est évidemment pas la bonne option pour une grande structure complexe, mais c'est une très belle doublure, et en fait l'approche que j'ai fini par prendre. – podperson

0

var a=[1,2,3] 
 
b=JSON.parse(JSON.stringify(a)); 
 
document.getElementById("demo").innerHTML = b;
<p id="demo"></p>

0

ES6 S'il vous plaît étalée

let arrayCopy = [...myArray];