排序数组,在​​javascript中有连字符

时间:2017-11-01 08:44:38

标签: javascript jquery

我想在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 但它没有用。 &#34; A23&#34;排在第一位,&#34; A3-1&#34;来了。

我读了这篇文章并试了一下。 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。

我需要你的帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

您可以通过获取字符串的所有分隔部分来进行cusstom排序。

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