2010-09-23 4 views
52

Это мой код:Есть ли способ клонировать массив в jQuery?

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

Не JQuery есть метод 'клон'? Как я могу клонировать массив с помощью jQuery?

+0

Для многомерных массивов клонировании см - http://stackoverflow.com/questions/2294703/multidimensional-array-cloning-using -javascript – vsync

+0

Да. jQuery имеет метод клонирования, а также расширяется с глубоким параметром, установленным в true. См. Http://api.jquery.com/clone/ и http://api.jquery.com/jquery.extend/. Быстрый и грязный вариант для небольших объемов данных - использовать JSON.parse (JSON.stringify (оригинал)). Для больших объемов данных, возможно, вы не должны клонировать ?! – podperson

+0

use spread operator – zloctb

ответ

137

Просто используйте Array.prototype.slice.

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

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

+1

Это синоним 'slice (0)'? –

+0

@Peter Ajtai - да. –

+7

Спасибо meder. ....... Единственное, на что нужно обратить внимание, это то, что массивы являются объектами, поэтому вы можете прикреплять свойства и методы ... например, var var = = [1,2,3]; a.foo = function() {alert (this); }; 'С' slice() 'любые прикрепленные свойства и методы не копируются, поэтому вы не можете выполнить' b.foo() '... Я только выношу это, поскольку jQuery' .clone() 'делает включить опцию глубокой копии. Например: http://jsfiddle.net/B2LQL/ .......... Но это в значительной степени краеугольный случай в контексте этого вопроса. –

1

попробовать

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

использование в качестве

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

Это на всякий случай, если вы добавили другие свойства в массив в дополнение к значениям в массиве? (в отличие от использования 'slice (0)')? –

+0

@Peter - 'slice (0)' хорошо. Я просто показываю другой способ его решения. ;) – Reigel

+0

Отличный мужчина! Благодаря! – neoswf

6

Изменить

б = $. Клон (а) к Ь = $ (это) .clone (а), но некоторое время не работают

но сообщается

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

Решение вы используете простую встроенную функцию клонирования в 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

Отличная альтернатива является

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

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

-John Resig

Проверить аналогичный пост

+1

Япония. Расширение предназначено для объектов. Первоначальная функция Ur также была предназначена для Object. – neoswf

+0

Расширьте работу отлично для массива, просто замените пустой объект {} на пустой массив []. –

1

Другой вариант для использования Array.concat:

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

Это не делает трюк – neoswf

+0

В основном такая же проблема, как использование среза. – podperson

10

А как насчет jQuery.merge?

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

Это также делает мелкую копию и, следовательно, эквивалентно принятому ответу. – rych

+0

@rych Это не эквивалентно, так как оно также работает с объектами типа массива, которые не имеют метода .slice (например, NamedNodeMap). – janek37

4

Это, как я сделал это:

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

это создаст новую глубокую копию, не связанной с первой (не мелкой копией).

также это, очевидно, не будет клонировать события и функции, но хорошо, что вы можете сделать это в одной строке, и его можно использовать для любого короля объекта (массивы, строки, числа, объекты ...)

+1

Это, очевидно, не самый подходящий вариант для большой сложной структуры, но это довольно приятный однострочный лайнер, и на самом деле подход, который я в конечном итоге взял. – podperson

0

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

0

ES6 Пожалуйста, используйте распространять

let arrayCopy = [...myArray]; 
Смежные вопросы