我想在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。
我需要你的帮助。谢谢!
答案 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; }