如何复制或复制一个数组的数组

8
我正在尝试编写一个函数,用于复制一个数组的数组。我尝试了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插件 - 因此我需要将其转换为函数...而递归不是我的强项。

非常感谢您的帮助!

谢谢!


1
一定要使用 var 声明变量 "i"!用 for ... in 循环遍历数组可能存在风险,最好使用数值下标。 - Pointy
请参考:https://dev59.com/unRB5IYBdhLWcg3wpYio - Diodeus - James MacFarlane
2个回答

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

太棒了,正是我所需要的! - tuj

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

根据评论意见改进


1
当出现null时会中断(null.pop将抛出异常)。第一个检查应该类似于 if (typeof obj != "object" || !obj) - Alexander Pavlov
此外,继承属性的处理存在问题 - JavaScript中的“clone”具有问题的语义。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接