3

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?

3 Answers 3

7

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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

1 Comment

Thanks, Alex. I'm off to look up more info on javascript references!
0
<html>
<body>

<h2>JavaScript Array Sort</h2>

<p>The lowest number is <span id="demo"></span>.</p>

<script>
var points = [78, 78,99, 2, 5, 25, 10];
document.getElementById("demo").innerHTML = myArrayMin(points);

function myArrayMin(arr) {
    var len = arr.length
    var min = Infinity;
    while (len--) {
      if (arr[len] < min) {
        min = arr[len];
      }
    }
    return min;
}
</script>

</body>
</html>

Output is 2

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.