Sorting 'numbers' with multiple decimal points

折月煮酒 提交于 2019-12-01 03:40:18

I think something like this should do the trick:

nums.sort(function(a, b) {
    var nums1 = a.split(".");
    var nums2 = b.split(".");

    for (var i = 0; i < nums1.length; i++) {
        if (nums2[i]) { // assuming 5..2 is invalid
            if (nums1[i] !== nums2[i]) {
               return nums1[i] - nums2[i];   
            } // else continue
        } else {
            return 1; // no second number in b
        }
    }
    return -1; // was missing case b.len > a.len
});

Update heres a fiddle

When var nums = ['1.1.1', '2.6.7.3.2', '2.6.7', '2.6.7.3', '2.6.7.1', '6.4.23', '2.7']

Sorting this way => ['1.1.1','2.6.7.1','2.6.7.3.2','2.6.7','2.6.7.3','2.7','6.4.23']

To please megawac :D

list.sort(function (a, b) {
    var result;
    a = a.split('.');
    b = b.split('.');
    while (a.length) {
        if (result = a.shift() - (b.shift() || 0)) {
            return result;
        }
    }
    return -b.length;
});

Handles any number of dots :

input  ['1.3', '10', '1.2', '2', '1.1.2', '1.1.1', '1.1']
output ['1.1', '1.1.1', '1.1.2', '1.2', '1.3', '2', '10']

Try this :

var list = ['1.1.1', '10.2.3', '2.6.7', '21.10.4', '3.10.12', '4.11.5', '4.1.16', '6.4.23'];

list.sort(function (a, b) {
    a = a.split('.');
    b = b.split('.');
    return (
        a.shift() - b.shift()
    ) || (
        a.shift() - b.shift()
    ) || (
        a.shift() - b.shift()
    );
});

I went about this by splitting each number into an array and then performing a multidimensional sort, using a custom sort method. Here's what I've got:

function multiDecimalSort(input) {
    var output,
        i,
        len;

    output = [];

    // Unglue decimal parts
    for (i = 0, len = input.length; i < len; i++) {
        output.push(input[i].split('.'));
    }

    // Apply custom sort
    output.sort(function (a, b) {
        for (i = 0, len = a.length; i < len; i++) {
            // cast decimal part to int
            a[i] = parseInt(a[i], 10);
            b[i] = parseInt(b[i], 10);

            if (a[i] !== b[i]) {
                return a[i] - b[i];
            }
        }
    });

    // Rejoin decimal parts
    for (i = 0, len = input.length; i < len; i++) {
        output[i] = output[i].join(".");
    }

    return output;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!