Here is my fiddle: http://jsfiddle.net/sepoto/Zgu9J/1/

I'm starting with a reverse function:

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

The second array I make pointOrigins2 is not an independent copy of pointOrigins1. In other words modifying pointOrigins2 is also modifying pointOrigins1 which is not what I need to achieve. From my reading on StackOverflow I have tried a few options such as using slice or using a for loop however nothing seems to be working yet so I made a fiddle.

Is there a way to make an independent copy of the reversed array?

有帮助吗?

解决方案

You are making a new independent array, but you are not making independent copies of the items that fill your arrays. You need to do something like:

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

so that you are generating new objects (with the same properties) as well as the new array.

其他提示

All you have to do is clone your array before you reverse it! :)

The shortest way to type is:

var b = a.slice();

But using concat is correct as well. See:

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

If slice does not create a copy for you, you can use numpy arrays and create a deep copy this way:

np.copy(a);

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

use this function

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

Your function is working correctly, even if it could be abbreviated to

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

No. You are not modifying the pointOrigins2 array here, you are only accessing it and modifying the point object - the same point that was in the pointOrigins1 array. Yet, pointOrigins1 !== pointOrigins2.

You can modify the array independent from the other, e.g. like

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

and pointOrigins1 will stay untouched. So if you want to have points whose properties you can modify without being reflected somewhere else, you will need to create new points.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top