在JavaScript中创建一个反转数组的独立副本

3

这是我的代码片段: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循环,但目前似乎没有什么作用,所以我创建了一个fiddle。

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


7
return input.slice().reverse(); 的翻译是:return input.slice().reverse(); - undefined
https://dev59.com/R1LTa4cB1Zd3GeqPeOH_ - undefined
input.map((x, i, arr) => arr[arr.length - 1 - i]) - undefined
返回 Array.from(input).reverse(); - undefined
1
这个重复的问题最终得到了更好的答案。https://dev59.com/kV0a5IYBdhLWcg3wLWKx - undefined
5个回答

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

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


当对象不被操作时,克隆对象的意义何在? - undefined
我不知道,这只是我对OP问题的理解。他的函数正在创建一个新数组,但修改数组元素的属性也会影响其他数组。 - undefined
啊,我现在明白了 - 他在代码示例中提到了这一点,但在问题中没有提及。 - undefined

2
使用这个函数。
function reverseArray(input) {
var newArray = new Array();
for(var i = input.length-1; i >= 0; i--) {
    newArray.push(input[i]);
   }
   return newArray;
}

1

在调用 reverseArr 之前,我使用 splice 没有成功。 - undefined
确保您在使用切片创建的副本上调用函数。如果您的函数正常工作,它应该可以运行。 - undefined
使用 np.copy(a);如果切片没有为你创建副本,就这样使用。 - undefined

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将保持不变。因此,如果您想要具有可以修改属性而不会在其他地方反映的点,您需要创建新的点。


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

你试过我的另一个建议吗?只需使用切片来创建副本,然后将副本通过你的原始方法运行。这是最简单的解决方案。请参考:https://dev59.com/rqzns4cB2Jgan1zn-fAl#23666706 - undefined
在调用我的原始reverseArr之前,我尝试了调用slice。没有成功。并没有创建一个独立的副本。 - undefined
你可以通过使用np.copy(arr)来创建一个numpy数组的深拷贝:http://docs.scipy.org/doc/numpy/reference/generated/numpy.copy.html - undefined

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