【问题标题】:Efficient Deep copy in NodeJSNodeJS 中的高效深拷贝
【发布时间】:2016-04-25 21:28:16
【问题描述】:

我想在 NodeJS 中深度复制一个整数数组。 我尝试的第一种方法是

obj2 = JSON.parse(JSON.stringify(obj1));

但是,它是如此缓慢,因为它是一个大数组。

现在我正在使用

var l = obj1.length;
while (l--){
  obj2.push(obj1[l]);
}

虽然它更快,但我想知道是否存在更好的解决方案? 谢谢大家!

【问题讨论】:

  • 简单整数数组的“深拷贝”到底是什么意思?与浅拷贝有什么区别?
  • @adneo。我需要使用两个不同的数组(原始顺序和排序)
  • @LuyaoWang 为什么不直接获取排序数组?
  • @stdop 就地排序
  • 因为后面我需要一些原始数组的原始位置信息...

标签: javascript node.js algorithm deep-copy


【解决方案1】:

如果是数组,你试过了吗

var arr2 = arr1.slice(0);

它确实创建了一个浅拷贝,但对于只包含原始整数的数组来说,这无关紧要。

【讨论】:

  • 切片的参数是optional,所以arr1.slice() 就可以了。
  • @РоманПарадеев - 我仍然决定添加0 作为参数,以明确我们从一开始就进行切片。
  • 那为什么不显式设置两个索引呢?
  • @РоманПарадеев - 因为根据documentation,第一个参数不是可选的,只有第二个是可选的。
  • @adeneo 您显示 string 的文档,对于数组,第一个参数是 optional
【解决方案2】:

你也可以这样

var arr = [1,2,3,4,5,6,7,8],
    brr = arr.map(e => e);

【讨论】:

    【解决方案3】:

    如果您的数组仅包含数字(如果您的数组包含数组,它将不起作用),您可以使用不带参数的 Array.prototype.slice 函数

    var arr1 = [1, 2, 3, 4, 5];
    var arr2 = arr1.slice();
    

    【讨论】:

      【解决方案4】:

      如果需要获取排序后的数组,并保存元素在原数组中的位置信息:

      0) 原始数组:

      var obj1 = [1, 2, 3, 100, 5, 0, 200, 30];
      

      1) 必须保持原来的位置:

      var index = Object.keys( obj1 ).sort( function(a, b) {
        return obj1[a] - obj1[b];
      });
      
      // >> ["5", "0", "1", "2", "4", "7", "3", "6"]
      

      2) 得到一个排序好的数组:

      var obj2 = obj1.sort( function(a, b) {
        return a-b;
      });
      
      // >> [0, 1, 2, 3, 5, 30, 100, 200]
      

      3) 找到新索引为'0'的元素的原始位置:

      var originalIndex = index[0];
      
      // >> "5"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-29
        • 2012-04-12
        • 1970-01-01
        • 2015-01-13
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多