2010-09-23 20 views
52

Este es mi código:¿Hay algún método para clonar una matriz en jQuery?

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

no tienen un método jQuery 'clon'? ¿Cómo puedo clonar una matriz usando jQuery?

+0

Para matriz multidimensional clonación See - http://stackoverflow.com/questions/2294703/multidimensional-array-cloning-using -javascript – vsync

+0

Sí. jQuery tiene un método de clonación y también se extiende con el parámetro profundo establecido en verdadero. Consulte http://api.jquery.com/clone/ y http://api.jquery.com/jquery.extend/ La opción rápida y sucia para pequeñas cantidades de datos es usar JSON.parse (JSON.stringify (original)). Para grandes cantidades de datos, ¿quizás no deberías clonar? – podperson

+0

use spread operator – zloctb

Respuesta

137

Simplemente use Array.prototype.slice.

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

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

+1

Esto es sinónimo de 'slice (0)'? –

+0

@Peter Ajtai - sí. –

+7

Gracias, meder. ....... Lo único a lo que hay que tener cuidado es que las matrices son objetos, por lo que puede adjuntar propiedades y métodos ... como 'var a = [1,2,3]; a.foo = function() {alerta (esto); }; 'Con' slice() 'las propiedades y los métodos adjuntos no se copian, por lo que no se puede hacer' b.foo() '... Solo lo menciono, ya que' .clone() 'de jQuery lo hace incluye una opción de copia profunda. Por ejemplo: http://jsfiddle.net/B2LQL/ .......... Pero esto es más o menos un caso de esquina en el contexto de esta pregunta. –

1

tratar

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; 
    }​ 
} 

uso como

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

Esto es solo en caso de que haya agregado otras propiedades a la matriz además de los valores en la matriz. (en lugar de simplemente usar 'slice (0)')? –

+0

@Peter - 'slice (0)' es bueno. Solo estoy mostrando otra forma de resolverlo. ;) – Reigel

+0

¡Gran hombre! ¡Gracias! – neoswf

6

Cambio

b = $. Clon (a) a b = $ (this) .clone (a) pero algún tiempo no funcionan

pero se informó

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

Solución utiliza sencilla función de la copia incorporada de JavaScript

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

Una buena alternativa es

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

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

-John Resig

puesto de control similares

+1

Japón- Extender está destinado a Objetos. El primer func de Ur también estaba destinado a Object. – neoswf

+0

Extender también funciona muy bien para una matriz, simplemente cambie el objeto vacío {} en una matriz vacía []. –

1

Otra opción es para usar Array.concat:

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

Eso no funciona – neoswf

+0

Básicamente es el mismo problema que usar slice. – podperson

10

¿Qué pasa con el jQuery.merge?

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

Esto también hace una copia superficial, y por lo tanto es equivalente a la respuesta aceptada. – rych

+0

@rych Esto no es equivalente, ya que también funciona en objetos tipo array que no tienen un método .slice (por ejemplo, NamedNodeMap). – janek37

4

Así es como yo lo he hecho:

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

esto creará una nueva copia en profundidad no relacionado con el primero (no una copia superficial).

Esto obviamente no clonará eventos y funciones, pero lo bueno es que puedes hacerlo en una sola línea y puede usarse para cualquier rey de objeto (matrices, cuerdas, números, objetos ...)

+1

Esta obviamente no es la opción correcta para una estructura grande y compleja, pero es una línea muy bonita, y realmente el enfoque que terminé tomando. – podperson

0

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

0

ES6 Utilice difundir

let arrayCopy = [...myArray]; 
Cuestiones relacionadas