具有多个小数点的“数字”排序

13

我有很多带有多个小数点的“数字”(实际上它们是字符串)。但我想按照数字的方式对它们进行排序。

1.1.1
10.2.3
2.6.7
21.10.4
3.10.12
4.11.5
4.1.16
6.4.23

我希望他们按照第一组数字(小数点前的数字)排序,然后按照第二组数字排序,接着按照第三组数字排序(如可能继续为第四组或更多)。它们应该按照以下顺序排列:

1.1.1
2.6.7
3.10.12
4.1.16
4.11.5
6.4.23
10.2.3
21.10.4
什么是使用JS做这件事的最佳方法?我想我可能需要将每个数字拆分成一个数组,但也许有更好的方法。有什么想法吗?
什麼是使用JS做這件事的最佳方法?我想我可能需要將每個數字拆分成一個數組,但也許有更好的方法。有什麼想法嗎?

1
将每个数字拆分成一个数组并对每个集合进行排序,同时跟踪与其拆分数组相关联的每个字符串。可能会变得有趣。[1](https://dev59.com/NXNA5IYBdhLWcg3wL6oc#1063027)[2](https://dev59.com/NXNA5IYBdhLWcg3wL6oc#1063027) - Brett Weber
更新以处理任意数量的点号:https://dev59.com/gGIj5IYBdhLWcg3wmmNE#20080885 - user1636522
4个回答

14

我认为这样做应该会奏效:

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

更新 这里有一个范例

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']

按此方式排序 => ['1.1.1', '2.6.7.1', '2.6.7.3.2', '2.6.7', '2.6.7.3', '2.7', '6.4.23']


5
为取悦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;
});

处理任意数量的点:

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']

2
尝试这个:

试试看:

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

1
如果您使用while循环来进行移位,您可以处理n个小数。 - megawac
@megawac 我知道,只是懒得创建一个变量来处理减法的结果 :D - user1636522

0

我通过将每个数字拆分为一个数组,然后使用自定义的排序方法执行多维排序来实现这一点。以下是我的代码:

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

啊,看着@wared的解决方案...哇,就是这样。 - pgoldrbx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接