1252748
1252748

Reputation: 15372

javascript array.sort not working with integers

I'm having issues with javascript array sorting and integers. I have these functions defined:

function sortA(a,b){ 
  return a - b;
}
function sortD(a,b){ 
  return b - a;
}

then in a jquery $.each, I put some content in the arrays:

$('.'+sort_column).each(function(index, value) {

    var current_num = $.trim($(this).text())

    current_num = parseInt(current_num, 10); //convert to integer for numeric sorting.

    valuesArr.push(current_num);  

    console.log(typeof index); //just checking...this shows number in the console
});

var sort_asc = valuesArr.sort(sortA);
var sort_desc = valuesArr.sort(sortD);
console.log(sort_asc);
console.log(sort_desc);

but in the console, I get the arrays in the same order.

//console
[1214500, 1214499, 1214497, 1214481, 1214432, 1214421, 1214419, 1214418, 1214369, 1214045, 1205691]
[1214500, 1214499, 1214497, 1214481, 1214432, 1214421, 1214419, 1214418, 1214369, 1214045, 1205691]

curiously, if I append a string to the end, the sorting works

console.log( valuesArr.sort(sortD)  + "asdf");
console.log( valuesArr.sort(sortA)  + "asdf");

//console
[1214500,1214499,1214497,1214481,1214432,1214421,1214419,1214418,1214369,1214045,1205691asdf] 
[1205691,1214045,1214369,1214418,1214419,1214421,1214432,1214481,1214497,1214499,1214500asdf]

I don't know why I even tried that, but there you go. This is the first time I've worked with this method, so I've likely missed something quite basic. Many thanks for any help!

Upvotes: 2

Views: 5023

Answers (3)

thecodeparadox
thecodeparadox

Reputation: 87073

you can simply change your sortA() and sortD() like following:

function sortA(arr) {
    return arr.sort(function(a, b) {
       return a - b;
    });
}

function sortD(arr) {
    return arr.sort(function(a, b) {
       return b - a;
    });
}

And then use like following:

var myarr = [1214500, 1214499, 1214497, 1214481, 1214432, 1214421, 
             1214419, 1214418, 1214369, 1214045, 1205691];

sortA(myarr);

sortD(myArr);

DEMO

Upvotes: 2

Felix Kling
Felix Kling

Reputation: 816404

.sort() [MDN] sorts the array in-place. Both variables sort_asc and sort_desc reference the same array and therefore the output is the same.

Upvotes: 2

ZER0
ZER0

Reputation: 25322

You're sorting the same array's instance, that's why the order is the same. Basically sort changes the content of the array itself.

So both of them will be in desc order (that is the last sorting you're doing). If you want to keep the original instance intact, you should create new arrays:

var sort_asc = valuesArr.slice(0).sort(sortA);
var sort_desc = valuesArr.slice(0).sort(sortD);

console.log(valuesArr);
console.log(sort_asc);
console.log(sort_desc);

See also slice.

Upvotes: 4

Related Questions