【问题标题】:Making an independent copy of a reversed array in JavaScript在 JavaScript 中制作反向数组的独立副本
【发布时间】:2014-07-03 05:14:31
【问题描述】:

这是我的小提琴:http://jsfiddle.net/sepoto/Zgu9J/1/

我从一个反向函数开始:

function reverseArr(input) {
    var ret = new Array;
    for(var i = input.length-1; i >= 0; i--) {
        ret.push(input[i]);
    }

    //I tried changing the return value to
    //return ret.slice(0) which has no effect on making
    //an independent copy
    return ret;
}

我制作的第二个数组 pointOrigins2 不是 pointOrigins1 的独立副本。换句话说,修改 pointOrigins2 也是修改 pointOrigins1 ,这不是我需要实现的。根据我对 StackOverflow 的阅读,我尝试了一些选项,例如使用 slice 或使用 for 循环,但似乎没有任何效果,所以我做了一个小提琴。

有没有办法制作一个反转数组的独立副本?

【问题讨论】:

标签: javascript arrays reverse


【解决方案1】:

您正在制作一个新的独立数组,但您并未制作填充数组的项目的独立副本。您需要执行以下操作:

function reverseArr(input) {
    var ret = new Array;
    for(var i = input.length-1; i >= 0; i--) {
        ret.push({
            positionx: input[i].positionx, 
            positiony: input[i].positiony, 
            index: input[i].index
        });
    }

    return ret;
}

以便您生成新对象(具有相同属性)以及新数组。

【讨论】:

  • 对象不被操作时克隆有什么意义?
  • 我不知道,这就是我阅读 OP 问题的方式。他的功能是创建一个新数组,但是修改一个数组元素的属性也会影响另一个数组。
  • 啊,我现在明白了 - 他在小提琴中提到了这一点,但在问题中没有。
【解决方案2】:

您所要做的就是在反转之前克隆您的数组! :)

最短的输入方法是:

var b = a.slice();

但是使用 concat 也是正确的。见:

Javascript fastest way to duplicate an Array - slice vs for loop

如果 slice 没有为您创建副本,您可以使用 numpy 数组并通过这种方式创建深层副本:

np.copy(a);

见:http://docs.scipy.org/doc/numpy/reference/generated/numpy.copy.html

【讨论】:

  • 在调用 reverseArr 之前我没有使用 splice。
  • 确保在切片创建的副本上调用函数。它应该可以工作(如果您的功能有效)。
  • 使用 np.copy(a);如果 slice 没有为您创建副本
【解决方案3】:

使用这个功能

function reverseArray(input) {
var newArray = new Array();
for(var i = input.length-1; i >= 0; i--) {
    newArray.push(input[i]);
   }
   return newArray;
}

【讨论】:

    【解决方案4】:
    function reverseArr(input) {
        return input.slice().reverse();
    }
    

    【讨论】:

    【解决方案5】:

    您的功能正常工作,即使它可以缩写为

    return input.slice().reverse();
    

    //This will show that pointOrigins2 is not an independent copy of pointOrigins1
    //When pointOrigins2 is modified pointOrigins1 is also being modified
    pointOrigins2[0].index++;
    

    没有。您没有在此处修改 pointOrigins2 数组,您只是在访问它并修改 point 对象 - 与 pointOrigins1 数组中的同一点。然而,pointOrigins1 !== pointOrigins2

    您可以独立于另一个修改数组,例如喜欢

    pointOrigins2[0] = {
        positionx: pointOrigins2[0].positionx, 
        positiony: pointOrigins2[0].positiony, 
        index:     pointOrigins2[0].index + 1
    };
    

    pointOrigins1 将保持不变。因此,如果您希望点的属性可以修改而不反映在其他地方,则需要创建新点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2021-10-22
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多