有没有在 jQuery 中克隆数组的方法?

Posted

技术标签:

【中文标题】有没有在 jQuery 中克隆数组的方法?【英文标题】:Is there a method to clone an array in jQuery? 【发布时间】:2011-04-16 02:02:36 【问题描述】:

这是我的代码:

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

jQuery 没有“克隆”方法吗?如何使用 jQuery 克隆数组?

【问题讨论】:

对于多维数组克隆,请参阅 - ***.com/questions/2294703/… 是的。 jQuery 有一个 clone 方法,并且还使用设置为 true 的 deep 参数进行扩展。请参阅api.jquery.com/clone 和api.jquery.com/jquery.extend 少量数据的快速而肮脏的选择是使用 JSON.parse(JSON.stringify(original))。对于大量数据,也许您不应该克隆?! 使用扩展运算符 【参考方案1】:

只需使用Array.prototype.slice

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

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

【讨论】:

这是slice(0)的同义词? 谢谢 meder。 ....... 唯一需要注意的是,数组是对象,所以你可以附加属性和方法......比如var a=[1,2,3]; a.foo = function() alert(this); ;slice() 任何附加的属性和方法都不会被复制,所以你不能这样做b.foo()...我只提出来,因为 jQuery 的.clone() 确实包含一个深拷贝选项。例如:jsfiddle.net/B2LQL .......... 但在这个问题的上下文中,这几乎是一个极端情况。 我猜我的测试代码完全错误。我上传了一个小提琴,它工作正常jsfiddle.net/neoswf/ebuk5。它的定义还指出它返回一个副本,而不是一个引用。 developer.mozilla.org/en/javascript/Reference/Global_Objects/…。我编辑了你的答案并将小提琴添加到那里。 小心:这是一个复制。不是深拷贝。所以数组中的任何对象都不会被复制,它们只是被引用。 @Ariel,那么你如何进行深拷贝?【参考方案2】:

jQuery.merge 呢?

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

【讨论】:

这也是浅拷贝,因此等同于接受的答案。 @rych 这不等效,因为它也适用于没有 .slice 方法的类数组对象(例如 NamedNodeMap)。【参考方案3】:

改变

b=$.clone(a)b=$(this).clone(a) 但有时它不起作用

但被举报

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;

-康罗伊P

一个很好的选择是

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

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

-约翰·雷西格

查看类似帖子

What is the most efficient way to deep clone an object in JavaScript?

【讨论】:

Japan- Extend 用于对象。你的第一个函数也适用于对象。 Extend 也适用于数组,只需将空对象 更改为空数组 []。 当我使用 extend() 并传入 时,它无法正常工作。如果我传入 [] 可能会起作用。【参考方案4】:

这就是我的做法:

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

这将创建一个与第一个不相关的新深层副本(不是浅层副本)。

这显然不会克隆事件和函数,但你可以在一行中完成它的好处,它可以用于任何对象之王(数组、字符串、数字、对象......)

【讨论】:

对于大型复杂的结构,这显然不是正确的选择,但它是一个非常好的单行,实际上我最终采用的方法。【参考方案5】:

ES6 请使用传播

let arrayCopy = [...myArray];

【讨论】:

【参考方案6】:

另一种选择是使用 Array.concat:

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

【讨论】:

和使用 slice 基本一样的问题。【参考方案7】:

试试

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]​

【讨论】:

这是为了防止除了数组中的值之外,您还向数组附加了其他属性? (而不是仅仅使用slice(0))? @Peter - slice(0) 很好。我只是展示另一种解决方法。 ;)【参考方案8】:

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

【讨论】:

以上是关于有没有在 jQuery 中克隆数组的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中克隆对象数组?

如何将jquery克隆行附加到隐藏字段

有没有办法在 jQuery 或 javascript 中克隆表单字段值?

Jquery浅克隆与深克隆

Jquery浅克隆与深克隆

jQuery 克隆和附加功能在 AngularJS 指令中没有按预期工作