在 PHP 中,数组有很多排序方法,不过其他语言的数组中大概是不会像 JS 的数组一样,包罗万象,啥都通吃的。所以 JS 的数组排序情况就略多一些了。

  • 简单粗暴的排序

    •  赤果果的sort:

  var  arr = ['Jason','Eric','Rose','Paul']
  arr.sort()
// arr => ['Eric','Jason','Paul','Rose'];

      • 这样排序的前提是数组本身元素类型单一,都为数字或者字符串,默认排序为按照首字母进行增序;
  • 稍微不那么粗暴的:
    •   有排序函数的sort:
      •   var  arr = ['10','1000','3','20'];
        arr.sort(); ==> ['10','1000','20','3'];
      • //现在我们想按照数字的值大小进行排序 0.0
        //先定义一个排序函数 sortNumber
        function sortNumber(a,b){
           return a-b;
        }
        arr.sort(sortNumber);
    • 在有排序函数的时候,sort 会按照元素的 value 去排序,这样做得前提仍然是数组元素类型单一为 number 或者 string,默认也是增序排序的。
      当然我们也可以认为通过指定排序函数返回值的方法来控制数组最终的排序方式:
      • return 1   ==》降序;
      • return -1  ==》增序;
  • 稍微复杂的排序:
      •   上面介绍的排序方法都针对的是简单的数组,但是 JS 的数组是很复杂的,大多数情况我们处理后台返回的数据都会遇到数组中包含各种复杂的对象。这样听起来比较抽象,说一个我自己做东西的例子吧。假如现在有一个论坛,页面上成千上万的帖子,用户有一个搜索动作,但是进行的是模糊查询,他可能是按照帖子的作者author,帖子的名称title,或者帖子内容message查询的。帖子是存在 mongoDB中,我们根据用户输入的关键字,将其视为 title,author,message 进行查询,这样就获得了三个结果集,arr1,arr2,arr3。然后我们需要将结果集进行合并,得到 arr4。那么现在问题来了,我们如果直接合并三个结果集,其中必然有重复的帖子,这就涉及到数组的去重。当然,这里有一个方案,在合并三个结果集时,依次向新结果集逐个元素插入然后每次插入新元素去结果集中检索有没有当前要插入的元素,如果有就丢弃。但是这样每插入一个元素就要遍历整个数组并且还要对每个元素进行属性的遍历,很容易导致性能问题,所以这里介绍一下方案二,就是先暴力的合并,然后排序,最后进行去重处理。
      • 要去重,我们先进行一下排序。注意,这里的数组元素就是各种复杂的对象了,但是这些对象都有唯一标识就是_id属性,所以我们就根据它们的_id 进行排序,这样相同的元素就处在了相邻的位置。
        • 定义排序函数 sortByKey:根据_Id 进行排序:
          var sortedArr = arr.sort(sortByKey('_id'));
          var result = [];

          •   function sortByKey (key){
                  return function(a,b){
                             return a[key] - b[key];
                      } 
                  }
        • 去重生成最终结果集result:
          (fucntion(){
              var len = sortedArr.length;
            for(var i=0; i<len;i++){
                  if(sortedArr[i]._id !== sortedArr[i+1]._id){
                      result.push(sortedArr[i]);
                  }
              }
          })()

JS 数组博大精深,数据处理时用到的非常频繁,用的不好通常会影响性能,欢迎各位道友批评指正,说说心得

JS 中数组的排序和去重的更多相关文章

  1. JS中数组重排序方法

    在数组中有两个可以用来直接排序的方法,分别是reverse()和sort().下面通过本文给大家详细介绍,对js数组重排序相关知识感兴趣的朋友一起看看吧 1.数组中已存在两个可直接用来重排序的方法:r ...

  2. js中数组去重的几种方法

    js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                 ...

  3. js中数组去重方法及性能对比

    js中数组的 数组去重 常用的数组去重方法以及效率分析: 首先我们先构建一个数组,主要是用于进行去重实验,我们主要实验的量级为1000,10000,100000,500000.具体的生成数组的方法如下 ...

  4. JavaScript -- 时光流逝(二):js中数组的方法

    JavaScript -- 知识点回顾篇(二):js中数组的方法 1. 数组 (1)定义数组,数组赋值 <script type="text/javascript"> ...

  5. JS中数组的介绍

    一.数组: 一组数据的集合: 二.JS中数组的特点: 1.数组定义时无需指定数据类型: 2.数组定义时可以无需指定数组长度: 3.数组可以存储任何类型的数据: 4.一般是相同的数据类型: 三.数组的创 ...

  6. js中数组如何使用

    js中数组如何使用 一.总结 一句话总结:new Array()和[]两种方法都可以创建数组. 二.js中创建数组,并往数组里添加元素 数组的创建 var arrayObj = new Array() ...

  7. js中数组方法大全

    js数组方法大全 一:前言 我们在学到js中数组的时候,我们会接触到js中数组的一些方法,这些方法对我们来说,可以很遍历的达到我们想要的结果,但是因为方法比较多,有些方法也不常用,可能会过一段时间就会 ...

  8. php中数组自定义排序

    php中数组自定义排序方法有很多,现在只提usort();不会保留原有键名. unsort调用方法就是unsrot($arr,func); 注意: 如果func是写在当前类中的话,那么调用的方式是 u ...

  9. java对一个int数组进行排序、去重

    思路: 1.使用 HashSet 进行去重 2.将 HashSet 变为 TreeSet 3.使用 TreeSet 进行排序 4.将 Set 变为 Integer 数组 5.将 Integer 数组变 ...

随机推荐

  1. C# .net 最大HTTP连接数

    说明:本WCF程序收到请求时会对外HTTP请求. 桌面系统默认是2个,如果是SERVER,默认是10个,超过10个就会排队,当有大量向外请求时,很多对外请求就会超时.排队的HTTP请求超时仍在计时. ...

  2. 安卓集成发布详解(二)gradle

    转自:http://frank-zhu.github.io/android/2015/06/15/android-release_app_build_gradle/ 安卓集成发布详解(二) 15 Ju ...

  3. JavaScript权威指南 第七章 数组

    主要介绍一下数组方法 1.Join() Array.join()方法将数组中所有元素都转换为字符串并连接在一起,返回最后生成的字符串. 可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素.默 ...

  4. Freescle cortex-A9(完善中...)

    关键词:cortex-A9 , udoo ,mars board ; (内容参考,飞思卡尔官方网站,如有问题请联系本人) i.MX 6系列处理器推出了业界首个具有真正扩展性的多核平台,包括基于ARM® ...

  5. MVC 介绍

    1>.NUGET,发布软件,管理平台: 2>.Razor,mvc视图引擎,集中生成HTML代码模板@开始,有自己的格式,语法,如同web forms视图引擎web forms view e ...

  6. OAF_MDS系列1_OAF页面元数据结构MDS的解析(概念)

    2014-06-06 Created By BaoXinjian

  7. MST_kruskal

    kruskal是求最小生成树的算法. 首先,kruskal就是把所有边按照权值从小到大的顺序排列,这一步可以直接使用sort,然后依次考查每一条边,设w=(u,v)表示从u到v的一条边的权值为w,则有 ...

  8. sql异常

    表结构 Id int UncheckedTitle nvarchar(50) CheckedValue nvarchar(1000) CheckedRemark nvarchar(1000) Chec ...

  9. myBatis出现Mapped Statements collection already contains value for

    造成这个问题的原因很多,我遇到的主要是因为 <select id="queryCountfor****" parameterType="java.lang.Inte ...

  10. php新浪微博登录接口用法实例

    本文实例讲述了php新浪微博登录接口用法.分享给大家供大家参考.具体分析如下: 在做微博登陆之前是需要申请到APP KEY 和App Secret,这个的申请方式请去 open.weibo.com 申 ...