This question already has answers here:
Sort Array Elements (string with numbers), natural sort

(8个答案)


3年前关闭。




我想在javascript中实现此排序结果。

A1-1,A1-3,A1-3-1,A1-4,A2,A4-1,A6-3,A13-1,A13-2,A13-3,A13-11,A13-14,A51- 2个

但是我用此代码有以下结果。
sortedAlphabetListData.sort(
  function(a,b){
    if( a[0] < b[0] ) return -1;
    if( a[0] > b[0] ) return 1;
    return 0;
  }
);

A1-1,A1-3,A1-3-1,A1-4,A13-1,A13-11,A13-14,A13-2,A13-3,A2,A4-1,A51-2,A6- 3

我尝试了这个图书馆。
https://gist.github.com/think49/660141
但这没有用。首先是“A23”,然后是“A3-1”。

我阅读了这篇文章并尝试了它。
Javascript : natural sort of alphanumerical strings
var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
var sortedAlphabetListData = alphabetListData.sort(collator.compare);

但是它只能在IE11上运行,而不能在Safari上运行。我需要支持IE9和Safari。

我需要你的帮助。谢谢!

最佳答案

您可以采用字符串的所有分离部分来进行客制化排序。

function customSort(data, order) {

    function isNumber(v) {
        return (+v).toString() === v;
    }

    var sort = {
            asc: function (a, b) {
                var i = 0,
                    l = Math.min(a.value.length, b.value.length);

                while (i < l && a.value[i] === b.value[i]) {
                    i++;
                }
                if (i === l) {
                    return a.value.length - b.value.length;
                }
                if (isNumber(a.value[i]) && isNumber(b.value[i])) {
                    return a.value[i] - b.value[i];
                }
                return a.value[i].localeCompare(b.value[i]);
            },
            desc: function (a, b) {
                return sort.asc(b, a);
            }
        },
        mapped = data.map(function (el, i) {
            var string = el.replace(/\d(?=[a-z])|[a-z](?=\.)/gi, '$&. .'),
                regex = /(\d+)|([^0-9.]+)/g,
                m,
                parts = [];

            while ((m = regex.exec(string)) !== null) {
                parts.push(m[0]);
            }
            return { index: i, value: parts, o: el, string: string };
        });

    mapped.sort(sort[order] || sort.asc);
    return mapped.map(function (el) {
        return data[el.index];
    });
}

var array = ['A1-1', 'A1-3', 'A1-3-1', 'A1-4', 'A2', 'A4-1', 'A6-3', 'A13-1', 'A13-2', 'A13-3', 'A13-11', 'A13-14', 'A51-2'];

console.log(customSort(array));
console.log(customSort(array, 'desc'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

10-06 14:53