我已经设法按元素名称'post_api_name'对对象数组进行排序,但是这些元素中的一些以希腊符号(例如α-βArteether)开头。如何将这些符号转换为0-9而不是Z + 1。
RESULT.sort(function(a, b) {
var textA = a.post_api_name.toUpperCase();
var textB = b.post_api_name.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
为清楚起见,当前排序的结果显示为:
一 b C α
我希望实现:
α 一个 b ç
答案 0 :(得分:3)
您可以尝试使用希腊语区域设置进行排序。您可能希望测试更多案例,因为我不知道可以应用哪些其他排序规则。浏览器对localeCompare的支持仍然相对前沿(IE11)。也许你可以找到poly-fill。
也许更优选的是,您可能只有一个支持的希腊字符列表,并将其替换为9和A之间的字符之一用于排序目的(:;&lt; =&gt;?或@)。
var items = ['a', 'b', 'c', 'α', '9', '4', '1']
items.sort(function(a, b){
return a.localeCompare(b, 'el');
});
console.log(items);
答案 1 :(得分:0)
默认情况下,“α”等字符的十进制代码将从128开始,即它们属于扩展的ASCII代码。
我知道根据您的要求,没有特别的方法可以做到这一点。您可以尝试下面的功能,它将实现您对正常字符的排序,并首先放置希腊/附加字符。
var mySortedChars = [];
function sortMyArray(array) {
array.forEach(function(val) {
if (val.charCodeAt(0) > 127) {
mySortedChars.push(val);
_.pull(array, val);
}
});
array.sort();
array.forEach(function(val) {
mySortedChars.push(val);
});
return mySortedChars;
}
上述功能将根据您的要求返回已排序的字符。
注意:_.pull
是来自lodash库的util。您可能必须使用自己的方法来拼接特殊字符,而不是使用_.pull(array, val);
答案 2 :(得分:0)
用ES6编写的可能解决方案。将数据拆分为标准和希腊起始元素。对这些结果进行排序,然后将它们连接起来。
const greekLower = new Set();
for (let c = 0x3B1; c < 0x3C9; c += 1) {
greekLower.add(String.fromCodePoint(c));
}
const data = ['xa', 'αb', 'yc', 'βd', 'ae', '1f', 'γg', '9h'];
const standard = [];
const greek = [];
for (let v of data) {
if (greekLower.has(v.charAt(0).toLowerCase())) {
greek.push(v);
} else {
standard.push(v);
}
}
standard.sort();
greek.sort();
const sorted = greek.concat(standard);
document.getElementById('out').textContent = JSON.stringify(sorted);
console.log(sorted);
&#13;
<pre id="out"></pre>
&#13;