如何复制或复制数组数组

Posted

技术标签:

【中文标题】如何复制或复制数组数组【英文标题】:How to copy or duplicate an array of arrays 【发布时间】:2012-03-13 01:13:10 【问题描述】:

我正在尝试创建一个复制数组数组的函数。我试过 blah.slice(0);但它只复制参考。我需要制作一个保持原件完好无损的副本。

我在http://my.opera.com/GreyWyvern/blog/show.dml/1725165找到了这个原型方法

Object.prototype.clone = function() 
  var newObj = (this instanceof Array) ? [] : ;
  for (i in this) 
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") 
      newObj[i] = this[i].clone();
     else newObj[i] = this[i]
   return newObj;
;

它可以工作,但是弄乱了我正在使用的一个 jQuery 插件——所以我需要将它变成一个函数……递归并不是我最擅长的。

您的帮助将不胜感激!

干杯,

【问题讨论】:

请务必使用var 声明“i”!此外,使用 for ... in 循环遍历数组也是有风险的——使用数字索引更安全。 见:***.com/questions/565430/… 【参考方案1】:
function clone (existingArray) 
   var newObj = (existingArray instanceof Array) ? [] : ;
   for (i in existingArray) 
      if (i == 'clone') continue;
      if (existingArray[i] && typeof existingArray[i] == "object") 
         newObj[i] = clone(existingArray[i]);
       else 
         newObj[i] = existingArray[i]
      
   
   return newObj;

【讨论】:

太棒了。正是我需要的!【参考方案2】:

例如:

clone = function(obj) 
    if (!obj || typeof obj != "object")
        return obj;
    var isAry = Object.prototype.toString.call(obj).toLowerCase() == '[object array]';
    var o = isAry ? [] : ;
    for (var p in obj)
        o[p] = clone(obj[p]);
    return o;

根据 cmets 改进

【讨论】:

将因null 而中断(null.pop 将抛出)。第一次检查应该类似于if (typeof obj != "object" || !obj) 此外,对继承属性的处理存在问题 - javascript 中的“克隆”存在语义问题。

以上是关于如何复制或复制数组数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将数组 char 复制到字符串或 int* (void *) 中? [关闭]

如何同时解构和复制数组?

如何“连接”或“组合”或“加入”一系列“二进制”序列化字节数组? [复制]

如何根据数组索引从数组复制到 Vector256,反之亦然?

如何在不使用 JSON.stringify 或 JSON.parse 的情况下在 javascript 中克隆数组? [复制]

如何在 C# 中删除(或取消)泛型数组列表中的对象? [复制]