JS实现⾃定义排序
定义:⽤本地特定的顺序来⽐较两个字符串。
语法: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) {
sort函数 jssegs.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(⾮数字),或者是正、负⽆穷⼤的数,则返回 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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论