Javascript数组排序各种方法总结

单数组排序

sort()函数

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

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

JavaScript代码

例1

假定有如下数组:

 代码如下 复制代码

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);

时间: 2024-11-08 22:12:19

Javascript数组排序各种方法总结的相关文章

javascript数组去重方法汇总

  javascript数组去重方法汇总        数组去重复是一个常见的需求,我们暂时考虑同类型的数组去重复.主要是理清思路和考虑下性能.以下方法,网上基本都有,这里只是简单地总结一下. javascript数组去重方法汇总 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

JavaScript中用sort()方法对数组元素进行排序的操作_基础知识

 JavaScript数组sort()方法排序数组的元素.语法 array.sort( compareFunction ); 下面是参数的详细信息:     compareFunction : 指定一个函数,定义排序次序.如果省略,数组字典顺序排序. 返回值: 返回一个排序的数组例子: <html> <head> <title>JavaScript Array sort Method</title> </head> <body> &l

javascript数组排序汇总_javascript技巧

javascript数组排序汇总 //排序算法 window.onload = function(){ var array = [0,1,2,44,4, 324,5,65,6,6, 34,4,5,6,2, 43,5,6,62,43, 5,1,4,51,56, 76,7,7,2,1, 45,4,6,7,8]; //var array = [4,2,5,1,0,3]; console.log('原始数组'); console.log(array); array = sorting.shellSort

javascript数组去重方法汇总_javascript技巧

javascript数组去重方法汇总 Array.prototype.unique1 = function () { var n = []; //一个新的临时数组 for (var i = 0; i < this.length; i++) //遍历当前数组 { //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; }; Array.pro

被遗忘的javascript的slice() 方法

  javascript数组对象的slice方法从数组中分离出一个子数组,功能类似于字符串对象的substring方法.今天我们就来详细探讨下javascript的这个不太常用的slice()方法. slice() 方法可从已有的数组中返回选定的元素. 好吧,我承认我竟然把它忘了! 这次我在回顾一下它 语法 arrayObject.slice(start,end) 数组.slice(起始,结束) ? 1 2 3 4 5 6 7 8 9 10 <script type="text/javas

调试javascript的好方法

javascript 调试javascript的好方法 1.从微软网站下载MS Script Debugger并安装,这是下载地址:http://download.microsoft.com/download/winscript56/install/1.0a/NT45XP/EN-US/scd10en.exe 2.修改IE的设置:IE的选项-->高级,有两个选项默认是钩选的:Disable Script Debugging(Internet Explorer)Disable Script Debu

JavaScript中的方法、方法引用和参数学习

首先,我们来看一段代码,如何觉得不甚明白的,则本文会对你有益: var player = function (e) {            return (function f(m) {    return m ? (function (n) {        return $('#Player', n).get(0) || f($('iframe', n).get(0));    })(m.contentWindow.document) : null;  })($(e).get(0)); }

Javascript中indexof方法的妙用

JavaScript中indexOf方法的语法:theString.indexOf(subString,[n]).它在指定字符串对象中寻找传送的子字符串,如果指定参数n,它可以从指定的位置开始向前搜索(从左往右).如果找到子字符串,返回子字符串在字符串中的位置:如果没有找到相应的字符串,返回-1. 利用它的这个属性,我们可以叫它干很多事,只要你指挥得当. 一.判断OS 虽然HTTP协议是跨平台的,但你编写的HTML页面最终的显示效果却往往与客户端所用的操作系统有关.比如MSOS系列(MS-DOS

JavaScript的replace方法与正则表达式结合应用讲解

大家好!!今晚在华软G43*宿舍没什么事做,把javascript中replace方法讲解一下,如果讲得不对或不合理是情理之中的事,因为我不是老鸟,也不是菜鸟,我也不知道我当底是什么鸟??呵~~ replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串..为了帮助大家更好的理解,下面