有没有在 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 中克隆数组的方法?的主要内容,如果未能解决你的问题,请参考以下文章