2016-08-25 267 views
1

我设法按元素名称'post_api_name'对对象数组进行排序,但其中一些元素以希腊符号(例如α-βArteether)开头。如何将这些符号转换为与0-9而非Z + 1一起放置。如何对希腊字母/符号进行排序JavaScript

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 Ç α

我希望能实现:

α 一个 b Ç

+1

你有一些例如初始数据和预期的结果? – Xotic750

+0

好点 - 我已经更新了我原来的帖子。 – Nick

+0

这些希腊字母应该在数字还是其他符号之前或之后出现? – Xotic750

回答

3

你可以尝试排序使用希腊语区域。你会想测试更多的案例,因为我不知道其他排序规则可以应用。浏览器支持localeCompare仍然比较尖端(IE11)。也许你可以找到poly-fill

也许更可取的是,您可能只是有一个希腊字符的列表,您支持并用9和A之间的一个字符替换它们以进行排序(:; < =>?或@)。

var items = ['a', 'b', 'c', 'α', '9', '4', '1'] 
 

 
items.sort(function(a, b){ 
 
    return a.localeCompare(b, 'el'); 
 
}); 
 

 
console.log(items);

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库一个实用程序。您可能必须使用自己的方法拼接特殊字符,而不是使用_.pull(array, val);

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);
<pre id="out"></pre>

相关问题