Javascript数组排序各种方法总结,JavaScript实现拼音
分类:计算机网络

一般情况下,大家会使用下面的方法来进行汉字的拼音排序

Javascript数组排序方法有很多,js本身就提供了大量的数据排序函数,下面我们除使用本身来实现排序之外,其它的自定排序方法也介绍介绍。

JS中使用sort结合localeCompare实现中文排序实例,sortlocalecompare

说到表格排序,首先要说的就一定是数组的排序,因为数组排序是表格排序的基础。

JavaScript为数组提供了sort()方法用于表格排序,默认情况下该方法会使Array中的数组按照ASCII码的顺序进行排列,JavaScript还为数组提供了数组倒序的方法reverse()。

看一下示例:

复制代码 代码如下:

 function sortArray(){
             var arrayTest = ["z",5,2,"a",32,3];
             arrayTest.sort();
             alert(arrayTest.toString());     //output:2,3,32,5,a,z
             arrayTest.reverse();
             alert(arrayTest.toString());    //output:z,a,5,32,3,2
         }
         sortArray();

呵呵,5比32还要大,很明显这不是我们想要的结果,刚才已经说过sort()方法是按照ASCII码的顺序排序的。

其实sort()方法还允许带一个函数类型的的参数,我们可以称之为比较函数,当该比较函数又可以接收两个参数,以下该函数返回值的意义:

复制代码 代码如下:

-1:第一个参数 小于 第二个参数
0:第一个参数 等于 第二个参数
1:第一个参数 大于 第二个参数

复制代码 代码如下:

/**
  * 比较函数
  * @param {Object} param1 要比较的参数1
           * @param {Object} param2 要比较的参数2
           * @return {Number} 如果param1 > param2 返回 1
           *                     如果param1 == param2 返回 0
           *                     如果param1 < param2 返回 -1
           */
          function compareFunc(param1,param2){
             //如果两个参数均为字符串类型
             if(typeof param1 == "string" && typeof param2 == "string"){
                 return param1.localeCompare(param2);
             }
             //如果参数1为数字,参数2为字符串
             if(typeof param1 == "number" && typeof param2 == "string"){
                 return -1;
             }
             //如果参数1为字符串,参数2为数字
             if(typeof param1 == "string" && typeof param2 == "number"){
                 return 1;
             }
             //如果两个参数均为数字
             if(typeof param1 == "number" && typeof param2 == "number"){
                 if(param1 > param2) return 1;
                 if(param1 == param2) return 0;
                 if(param1 < param2) return -1;
             }
         }

当我们执行arrayTest.sort(compareFunc)时我们就得到了正确的结果。
到这里,我们不得不说明一下localeCompare()方法的用法,该方法是对字符串进行排序的方法,只有一个参数即要比较的字符串。

具体说明如下:

1、如果String对象按照字母顺序排在参数中的字符串之前,返回负数
2、如果String对象按照字符顺序排在参数中的字符串之后,返回正数
3、如果String对象等于参数中的字符串返回0

除此之外,localeCompare()方法还有一个独特之处,这个独特之处可以在其方法签名locale(现场、当地)上得以体现,也就是说他的实现时按照区域特性来的,如果在英语体系中,他的实现可能是按照字符串升序,如果在汉语中,他的实现则是按照首字母的拼音。

呵呵,这也就是说就算我们在程序中涉及汉字,我们的排序也不回出错。
参考以下程序:

复制代码 代码如下:

var testArray = ["脚","本","之","家"];
         document.write(testArray.sort(
             function compareFunction(param1,param2){
                 return param1.localeCompare(param2);  //output:之,家,本,脚
             }
         ));

复制代码 代码如下:

单数组排序

js中用localeCompare()方法 比较字符串时,只比较第一个字符?

stringVar.localeCompare(stringExp)其中stringVar是必选项。一个 String 对象后文字。
stringExp是必选项。将与 stringVar 进行比较的字符串。

localeCompare 可以对 stringVar 和 stringExp 进行一个区分区域设置的字符串比较并返回 –1、0 或 +1,这取决于系统中缺省区域设置的排序。如果 stringVar 排序在 stringExp 之前,那么 localeCompare 返回 –1;如果 stringVar 排序在 stringExp 之后,则返回 +1。如果返回值为 0,那就说明这两个字符串是相同的。  

var list = [ '王', '张','李'];
list.sort(function (a, b) {
return a.localeCompare(b);
});

sort()函数

使用localeCompare按照汉字拼音排序的结不美观不太准怎措置?

var citys = ['北京-b','上海-s','广州-g','深圳-s','南京-n','姑苏-s','杭州-h','济南-j','青岛-q','武汉-w','沈阳-sh','成都-ch','天津-t','重庆-ch','西安-x','郑州-zh','石家庄-sh','长沙-ch','长春-ch','合肥-h','福州-f']; function sortRule(a,b) { return a.replace(/.*-(.+)$/, '$1') > b.replace(/.*-(.+)$/, '$1'); } window.onload = function(){ alert(citys.sort(sortRule)); }在safari浏览器上得不到正确的排序。。。firefox可以  

说到表格排序,首先要说的就一定是数组的排序,因为数组排序是表格排序的基...

localeCompare() :用本地特定的顺序来比较两个字符串。
通过localeCompare这个方法来进行拼音排序的不可靠之处在于:

数组对象的sort方法可以按照一定的顺序把数组元素重新排列起来。通常情况下,都是按照字幕顺序排列。在使用sort()排序时,每次比较两个元素时都会执行比较函数,并将两个元素作为参数传递给比较函数。比较函数有以下两种返回值。

  1. 很依赖中文操作系统
  2. 很依赖浏览器的内核
    也就是说,如果你的网站访问者是通过非中文系统,或者非IE浏览器(如Chrome),那么他将很可能无法看到我们所预期的拼音排序结果。

   1、如果返回值大于0,则交换两个元素的位置
   2、如果返回值小于或等于0,则不进行操作。


JavaScript代码

下面介绍一下我解决这个问题的办法,希望能抛砖引玉哈:
本方法支持Unicode字符集中从0x4E00到 0x9FA5 的连续区域内共20902个来自中国(包括台湾)、日本、韩国的汉字,即CJK(Chinese Japanese Korean)汉字。

例1

复制代码 代码如下:

假定有如下数组:

var CompareStrings = {
db: '吖阿啊锕錒嗄哎哀...袰襨鐢閪闏霻鶑', // 其中省略几万字
getOrderedUnicode: function (char) {
var originalUnicode = char.charCodeAt();
if (originalUnicode >= 0x4E00 && originalUnicode <= 0x9FA5) {
var index = this.db.indexOf(char);
if (index > -1) {
return index + 0x4E00;
}
}
return originalUnicode;
},
compare: function (a, b) {
if (a == b) {  return 0;
}
// 这里可以根据具体需求来改写,目前的写法是把空字符串排在最后if (a.length == 0) { return 1; }
if (b.length == 0) { return -1; }
var count = a.length > b.length ? b.length : a.length;
for (var i = 0; i < count; i++) {
  var au = this.getOrderedUnicode(a[i]);
  var bu = this.getOrderedUnicode(b[i]);
  if (au > bu) {
   return 1;
  } else if (au < bu) {
   return -1;
  }
}
return a.length > b.length ? 1 : -1;
 }
}
// 重写系统原生的localeCompare
String.prototype.localeCompare = function (param) {
  return CompareStrings.compare(this.toString(), param);
}

 代码如下

大家可以通过下面的链接下载到完整代码
简单介绍一下实现的原理:
1. 取得按拼音排序好的字库(db):有多种途径可以达到目的,我是用JavaScript+C#组合完成的,先用脚本把所有汉字枚举出来,再提交到C#后台排序好,再输出到前台,这个只是准备工作哈,怎么搞都可以。
2. 确定两个字符谁比较大(getOrderedUnicode):因为排序的时候,不光要处理汉字,还要处理汉字以外的字符,所以比较器必须能识别所有的字符,这里我们通过判断一个字符是否是汉字来区别对待:如果是汉字,那么就在排序好的字库里搜索它的索引值,得到的索引值再加上Unicode字符集中第一个汉字所处的位置,就是在“校准”以后的Unicode字符集中的索引值了;如果不是汉字,那么就直接返回它在Unicode字符集中的索引值即可。
3. 比较两个字符串(compare):逐一比较两个字符串中的每一个字符(在有效范围内比较,也就是较短的那个字符串的长度),如果发现a比b大,就返回1,反之返回-1。
4. 在有效范围内比较结束后如果还没分出胜负,就看谁比较长,例如a='123',b='1234',那么较长的b要排在后面。
绿色通道: 好文要顶 关注我 收藏该文与我联系

复制代码

您可能感兴趣的文章:

  • js 淘宝首页的拼音排序效果
  • Extjs Gird 支持中文拼音排序实现代码
  • javascript对中文按照拼音排序代码
  • javaScript对文字按照拼音排序实现代码
  • js实现汉字排序的方法
  • JavaScript 给汉字排序实例代码
  • js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
  • 利用JavaScript对中文(汉字)进行排序实例详解
  • js汉字转拼音实现代码
  • 用正则表达式判断字符串是汉字还是拼音的js函数代码
  • js仿淘宝的拼音检索特效代码
  • JS实现中文汉字按拼音排序的方法

var homes = [{
   "h_id": "3",
   "city": "Dallas",
   "state": "TX",
   "zip": "75201",
   "price": "162500"
}, {
   "h_id": "4",
   "city": "Bevery Hills",
   "state": "CA",
   "zip": "90210",
   "price": "319250"
}, {
   "h_id": "5",
   "city": "New York",
   "state": "NY",
   "zip": "00010",
   "price": "962500"
}];

可以通过下面方法对数组按价格进行排序:

 代码如下

复制代码

homes.sort(function(a,b) { return parseFloat(a.price) - parseFloat(b.price) } );

单个数组中的元素排序

 代码如下

复制代码

<script type="text/javascript">
function sort_desc(str)//对数组降序的函数
{
 str.sort(function compare(a,b){return b-a;});//是指对数组中1的对象中的第k个元素进行降序
 return str;
}
 function sort_asc(str)//对数组升序的函数
{
 str.sort(function compare(a,b){return a-b;});//是指对数组中1的对象中的第k个元素进行升序
 return str;
}
var tt=[4,10,8,98,2];
var bb=[];
bb=sort_desc(tt);
document.write(bb+"***降序输出");
var cc=[89,2,100,5];
var dd=[];
dd=sort_asc(cc);
document.write("<hr/>");//直线
document.write(dd+"***升序输出");
</script>

二维数组的排序。

1、按数值排序

假设有如下数组

 代码如下

复制代码

var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]];

这里如果我们要按每个子数组的第一列来排序要如何做呢,我们可以定义一个比较函数:

 代码如下

复制代码

arr.sort(function(x, y){
  return x[0] – y[0];
});

这里的比较函数的作用是什么呢?其实是数组依次将数组元素复制给x,y,比如首先将arr[0]赋给x,arr[1]赋给y,然后用x[0] – y[0],根据返回的值,如果返回的是大于0的数,那么就把数组中x放到y的后面,如果返回的是0则不变,小于0则将x放到y的前面,然后第一个排序好之后在进行下面两个的排序,直到整个数组排序完成。这是默认升序的比较函数,如果要降序排列则只需修改比较方式,改为 return y[0] – x[0] 即可,这里我们x[0]表示是按第一列进行排序,我们这里也可以按其他列进行排序。这里的排序默认就会修改arr的数组结构,所以排序完arr就是按第一列升序的数组了。

2、按字符串排序

按字符串排序的话呢,我们可以利用js提供的localeCompare方法,
localeCompare作用:用本地特定的顺序来比较两个字符串。
localeCompare方法的使用规则是stringObject.localeCompare(target),如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。如果 stringObject 大于 target,则该方法返回大于 0 的数。如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0,器比较使用的是本地的规则,本地规则意思就是使用操作系统底层对这些本地字符排序的规则进行排序,默认情况下比如使用大于号这样的比较只是纯粹比较两个字符的unicode的数大小,会与很多语言不符。
比如

 代码如下

复制代码

var arr = [['中','国'], ['啊','的'], ['哦','的']];
arr.sort(function(x, y){
  return x[0].localeCompare(y[0]);
});

结果就会按第一列中文字的拼音排序,如果含有英文的话,默认是将英文放在前面,如果是纯英文的话,会按字母顺序来,大写排在小写的后面,这样就可以实现字符串的排序了,包括中文和中英混排。至于要降序排列的话,方法与上面相同,改成return y[0].localeCompare(x[0]); 即可。

数组去重,排序,寻找索引

 

 代码如下

复制代码

//数组去重
Array.prototype.distinct = function(){
         var filtered= [];
             var _a = {};
              for(var i = 0;i<this .length;i++){
                      if(!_a[this[i]]) {//如果已经有了就不再添加
                          _a[this[i]] = 1;
                          filtered.push(this[i])
                      }
              }
           return filtered;
};

//二分法 寻找索引
function search (arr,item,lower,upper){
 lower = lower || 0;
 upper = upper || arr.length-1;
 if(lower == upper){
  if(item == arr[upper]){
      return upper;
        }else{
美高梅网址,            return -1;
        }
 }else{
  var middle = parseInt((lower+upper)/2);
  if(item > a[middle]){
      return search (arr,item,middle+1,upper);
  }else{
     return search (arr,item,lower,middle);
        }
 }

}

var a = [10,15,3,4,5,6,7,8,9,3,8,9];
a = a.distinct(); //[10, 15, 3, 4, 5, 6, 7, 8, 9]
a.sort(function(a,b){ return a-b;}); //排序 [3, 4, 5, 6, 7, 8, 9, 10, 15]
alert(search(a,9)); //6

遇到的面试题

Given an array that may contain nested arrays, return a flattened array. Input and out put are illustrated as follows.

将含有嵌套的数组排序输出。*号部分为需要写出的代码。

 代码如下

复制代码

var input = [{a: 'a'}, 'b', ['c', 'd'], ['e', ['f']], 'g'];
function flatten_array(arr){
var out = [];
*******;
return out;
 }

这个题目很明显应该用递归解决:(修改感谢@felix021提醒...)

 代码如下

复制代码

var input = [{a: 'a'}, 'b', ['c', 'd'], ['e', ['f']], 'g'];
var out = [];

loop(input);

function loop(object) {
  for( var a in object ) {
    if( typeof(object) === 'object' ) {
      loop(object[a]);
    }else{
      out.push(object[a]);
    }
  }
}
console.log(out);

...

本文由美高梅网址发布于计算机网络,转载请注明出处:Javascript数组排序各种方法总结,JavaScript实现拼音

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文