在JavaScript中制作反向数组的独立副本

时间:2014-05-14 23:11:11

标签: javascript arrays reverse

这是我的小提琴: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上的阅读中,我尝试了一些选项,比如使用切片或使用for循环,但似乎没有任何工作,所以我做了一个小提琴。

有没有办法制作反转阵列的独立副本?

5 个答案:

答案 0 :(得分:2)

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

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

这样您就可以生成新对象(具有相同的属性)以及新数组。

答案 1 :(得分:1)

您所要做的就是在逆转之前克隆阵列! :)

最短的输入方式是:

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

答案 2 :(得分:1)

使用此功能

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

答案 3 :(得分:0)

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

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数组,只是访问它并修改对象 - 与pointOrigins1数组中的相同点。然而,pointOrigins1 !== pointOrigins2

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

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

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

答案 4 :(得分:0)

function reverseArr(input) {
    return input.slice().reverse();
}