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

这是我的代码:

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

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

【问题讨论】:

标签: javascript jquery arrays clone


【解决方案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);

-约翰·雷西格

查看类似帖子

【讨论】:

  • 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>

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2012-12-18
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多