二维数组,不参考

可能重复:
什么是克隆JavaScript对象最有效的方法?

这也被称为“深层复制”,我发现了一些文章。 最近似乎是这一个,但它是为jQuery - 我试图做到这一点,没有一个库。

我也在两个地方看到,有可能做到这样的事情:

arr2 = JSON.decode(JSON.encode(arr1));

但是这显然效率很低。 也可以单独循环和复制每个值,并遍历所有数组。 这看起来很累,效率也不高。

那么,复制JavaScript多维数组[[a],[b],[c]]的最高效,非库方式是什么? 如果有必要,我对“非IE”方法感到非常满意。

谢谢!


因为听起来你正在处理一个阵列深度到某个未知的深度,但是你只需要在任何给定的时间在一个深度处理它们,那么使用.slice()将会很简单和快速.slice()

var newArray = [];

for (var i = 0; i < currentArray.length; i++)
    newArray[i] = currentArray[i].slice();

或者使用.map()而不是for循环:

var newArray = currentArray.map(function(arr) {
    return arr.slice();
});

因此,这将迭代当前数组,并构建嵌套数组的浅副本的新数组。 然后当你进入下一个深度时,你会做同样的事情。

当然,如果存在数组和其他数据的混合,则需要在分片之前测试它的内容。


我不确定JSON.stringyJSON.parseencodedecodeJSON.stringy ,但你可以尝试:

JSON.parse(JSON.stringify(array));

我发现的其他东西(虽然我会修改一下):

http://www.xenoveritas.org/blog/xeno/the-correct-way-to-clone-javascript-arrays

function deepCopy(obj) {
  if (typeof obj == 'object') {
    if (isArray(obj)) {
      var l = obj.length;
      var r = new Array(l);
      for (var i = 0; i < l; i++) {
        r[i] = deepCopy(obj[i]);
      }
      return r;
    } else {
      var r = {};
      r.prototype = obj.prototype;
      for (var k in obj) {
        r[k] = deepCopy(obj[k]);
      }
      return r;
    }
  }
  return obj;
}

当你问到性能时,我想你也会用非通用的解决方案。 要复制具有已知级别的多维数组,您应该使用最简单的解决方案,即一些嵌套for循环。 对于你的two-dimensioanl数组,它看起来像这样:

var len = arr.length,
    copy = new Array(len); // boost in Safari
for (var i=0; i<len; ++i)
    copy[i] = arr[i].slice(0);

本地slice方法比自定义for-loop更高效,但它不创建深度副本,因此我们只能在最低级别使用它。

链接地址: http://www.djcxy.com/p/6939.html

上一篇: dimensional array, not reference

下一篇: Clone Object without reference javascript