up vote 1 down vote favorite

barValues is an array I'm passing to a function. Within the function I have this:

alert(barValues);

var sortedBarValues = barValues;
sortedBarValues.sort(function(a,b){return b - a});

alert(barValues);

I'm trying to end up with two arrays. barValues being the original array and sortedBarValues being a copy of that array, now sorted.

However, via the two alerts, I'm finding that barValues is ALSO being sorted. Why is that? What is the proper way to make a copy of an array so sort it separately from the original array?

link|flag

67% accept rate

2 Answers

up vote 4 down vote accepted

With the statement var sortedBarValues = barValues;, you are not making a copy of the array. You are only making a reference. Both names refer to the same array.

You can copy it with var sortedBarValues = barValues.slice();. The slice method is meant for slicing arrays, but if you don't pass any parameters to it, it will make a copy.

Keep in mind that using the slice method won't work properly on multi-dimensional arrays. Copying multi-dimensional arrays is somewhat tricky, but jQuery's extend function can do it for you.

You can see information on how to copy an array in this post.

link|flag
1  
Thanks, Mike. Great explanation. – DA Sep 30 '09 at 22:39
up vote 1 down vote

When you assigned barValues to sortedBarValues you actually assigned a reference to the original Array. When you sort sortedBarValues, barValues gets sorted as well because they are actually the exact same thing.

You need to make a copy of your array before sorting it, so the other is left unaffected.

var sortedBarValues = Array.apply({}, barValues);
sortedBarValues.sort(function(a, b) { return b - a; });
link|flag
Thanks, Alex. I'm off to look up more info on javascript references! – DA Sep 30 '09 at 22:40

Your Answer

 
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.