简体   繁体   中英

Cannot sort array into ascending numeric order in Javascript

I'm trying to sort an array shown below using the .sort() method in JavaScript.

var addresses = [
    "5 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan",     
    "51 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", 
    "53 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", 
    "55 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", 
    "57 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", 
    "7 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", 
    "9 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan"
];

However, after the .sort method has been invoked and I write the array to the document. The array doesn't seem to change into ascending numeric order.

Can anyone see where I'm going wrong?

Your array contains strings, so they'll be sorted alphabetically instead of numerically. You'll want to use a sorting function as the parameter of array.sort and parse out the house number.

Got it working in the end with the following code shown below:

function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
    b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });

    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}

addresses = addresses.sort(naturalCompare);

You could use this sort function that compare the first numbers of the strings

 var addresses = [ "5 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "51 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "53 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "55 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "57 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "7 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "9 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan" ]; addresses.sort(function(a, b){ return +a.split(" ")[0] - +b.split(" ")[0]; }); console.log(addresses); 

check below example

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a-b});

http://www.w3schools.com/jsref/jsref_sort.asp

try this

 var addresses = [ "5 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "51 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "53 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "55 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "57 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "7 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan", "9 Glyn Eiddew, , , , Llanbradach, Caerphilly, Mid Glamorgan" ]; addresses.sort(function(a, b){ return a.split(' ')[0] - b.split(' ')[0] }) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM