repetidos objetos objects elementos elemento ejemplos buscar bidimensional arreglo array agregar javascript arrays copy

objects - buscar en un array de objetos javascript



Crear copia de matriz multidimensional, no referencia-JavaScript (4)

Posible duplicado:
¿Cuál es la forma más eficiente de clonar un objeto de JavaScript?

Esto también se conoce como "copia profunda", que he encontrado algunos artículos. El más cercano parece ser este, pero es para jQuery; estoy intentando hacer esto sin una biblioteca.

También he visto, en dos lugares, que es posible hacer algo como:

arr2 = JSON.decode(JSON.encode(arr1));

Pero eso es aparentemente ineficiente. También es posible hacer un bucle y copiar cada valor individualmente, y repetir a través de todas las matrices. Eso parece agotador e ineficiente también.

Entonces, ¿cuál es la forma más eficiente y no bibliotecaria de copiar una matriz multi-dimensional de JavaScript [[a],[b],[c]] ? Estoy completamente satisfecho con un método "no IE" si es necesario.

¡Gracias!


Como solicitó el rendimiento, supongo que también elegiría una solución no genérica. Para copiar una matriz multidimensional con un número conocido de niveles, debe ir con la solución más fácil, algunos bucles for-anidados. Para su matriz de dos dimensiones, simplemente se vería así:

var len = arr.length, copy = new Array(len); // boost in Safari for (var i=0; i<len; ++i) copy[i] = arr[i].slice(0);

El método de slice nativa es más eficiente que un ciclo for forzado personalizado, pero no crea copias profundas, por lo que solo podemos usarlo en el nivel más bajo.


Cualquier algoritmo recursivo que no visite el mismo nodo dos veces será lo más eficiente que obtenga con javascript (al menos en un navegador): en ciertas situaciones en otros idiomas, puede salirse con la suya copiando los mandriles de memoria, pero javascript obviamente no lo hace No tienes esa habilidad

Sugiero encontrar a alguien que ya lo haya hecho y usar su implementación para asegurarme de que lo haga bien, solo necesita ser definido una vez.


Dado que parece que se trata de una matriz de matrices con un nivel desconocido de profundidad, pero solo necesitas tratar con ellos en un nivel profundo en un momento dado, entonces será simple y rápido usar .slice()

var newArray = []; for (var i = 0; i < currentArray.length; i++) newArray[i] = currentArray[i].slice();

O usando .map() lugar del ciclo for :

var newArray = currentArray.map(function(arr) { return arr.slice(); });

Por lo tanto, esto itera la matriz actual y crea una nueva matriz de copias superficiales de las matrices anidadas. Luego, cuando pases al siguiente nivel de profundidad, harías lo mismo.

Por supuesto, si hay una combinación de matrices y otros datos, querrás probar lo que es antes de cortar.


No estoy seguro de cuánto mejor JSON.stringy y JSON.parse que encode y decode , pero podrías intentar:

JSON.parse(JSON.stringify(array));

Algo más que encontré (aunque lo modificaría un poco):

http://www.xenoveritas.org/blog/xeno/the-correct-way-to-clone-javascript-arrays

function deepCopy(obj) { if (typeof obj == ''object'') { if (isArray(obj)) { var l = obj.length; var r = new Array(l); for (var i = 0; i < l; i++) { r[i] = deepCopy(obj[i]); } return r; } else { var r = {}; r.prototype = obj.prototype; for (var k in obj) { r[k] = deepCopy(obj[k]); } return r; } } return obj; }