JS 排序:localeCompare() 方法实现中文排序、sort 方法实现数字英文混合排序
定义:用本地特定的顺序来比较两个字符串。
语法:stringObject.localeCompare(target)
参数:target——要以本地特定的顺序与 stringObject 进行比较的字符串。
返回值:说明比较结果的数字。
(1)如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。
(2)如果 stringObject 大于 target,则该方法返回大于 0 的数。
(3)如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。
说明:把 < 和 > 运算符应用到字符串时,它们只用字符的 Unicode 编码比较字符串,而不考虑当地的排序规则。以这种方法生成的顺序不一定是正确的。localeCompare() 方法提供的比较字符串的方法,考虑了默认的本地排序规则。ECMAscript 标准并没有规定如何进行本地特定的比较操作,它只规定该函数采用底层操作系统提供的排序规则。
实例:
1、可以使用 localeCompare() 方法来实现中文按照拼音排序,方法相当简单
var array = ['白鸽', '麻雀', '大象', '狗', '猫', '鸡']
array = array.sort(function compareFunction(item1, item2) {
return item1.localeCompare(item2)
})
//["白鸽", "大象", "狗", "鸡", "麻雀", "猫"]
而且可以通过如下代码实现中文按照拼音排序,并且可以将中文按照 a,b,c,d……进行区分。代码如下:
function pySegSort(arr, empty) {
if (!String.prototype.localeCompare) return null
var letters = '*abcdefghjklmnopqrstwxyz'.split('')
var zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')
var segs = []
var curr
$.each(letters, function (i) {
curr = { letter: this, data: [] }
$.each(arr, function () {
if ((!zh[i - 1] || zh[i - 1].localeCompare(this) <= 0) && this.localeCompare(zh[i]) == -1) {
curr.data.push(this)
}
})
if (empty || curr.data.length) {
segs.push(curr)
curr.data.sort(function (a, b) {
return a.localeCompare(b)
})
}
})
return segs
}
console.log(
JSON.stringify(
pySegSort(['白鸽', '麻雀', '黑', '大象', '狗', '猫', '妈妈', '马', '鸡', '瘦', '胖'])
)
)
结果显示为:
;[
{ letter: 'b', data: ['白鸽'] },
{ letter: 'd', data: ['大象'] },
{ letter: 'g', data: ['狗'] },
{ letter: 'h', data: ['黑'] },
{ letter: 'j', data: ['鸡'] },
{ letter: 'm', data: ['妈妈', '麻雀', '马', '猫'] },
{ letter: 'p', data: ['胖'] },
{ letter: 's', data: ['瘦'] },
]
通过这个就可以写一个电话薄,像现在手机上面的,通过人名来进行分组、排序,之后再通过循环和布局就可以实现电话薄的功能。
2、实现字母、数字的混合排序:
var d = [1, 2, 3, 'a', 'k', 'b', 'd', 10, 20, 'c']
d.sort(function (a, b) {
var c = isFinite(a), // 如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。
d = isFinite(b)
return (c != d && d - c) || a > b
})
console.log(d)
//[1, 2, 3, 10, 20, "a", "b", "c", "d", "k"]
isFinite() 判断 a、b 是否是数字。
return 后面的语句:
c != d && c - d 如果 c 和 d 不相等 ,也就是说比较的值不是同一类型。那就比较 c-d 的值是 1 还是-1(中间进行了隐式类型转换)
如果 c == d 也就是说 c、d 是同一类型的值,c、d 可能都是字母,也可能都是数字。这里就可以直接比较大小了(都是字母的话不能直接做减法)。 isFinite() 函数用于检查其参数是否是无穷大。如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。