这是我的小提琴: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循环,但似乎没有任何工作,所以我做了一个小提琴。
有没有办法制作反转阵列的独立副本?
答案 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();
}