一、问题

在使用sort排序时,若遇到相同数据或非数值数据时,会出现苹果手机与安卓手机排序不一致问题

var arr = [{
"id": "52",
"return_value": "--"
},{
"id": "54",
"return_value": "100,000.00%"
},{
"id": "66",
"return_value": "1000%"
},{
"id": "78",
"return_value": "--"
}];
function sortBy(arr, order, order_by){
    if (order == 'asc' || order == 'desc') {
      arr.sort((a, b) => {
        let x = a[order_by];
        let y = b[order_by];
        if (x == '--') {
          return -1
        }
        if (y == '--') {
          return 1
        }
        if ( !isNaN(parseFloat(x)) && !isNaN(parseFloat(y)) ) {
          x = parseFloat(x);
          y = parseFloat(y);
          if (x > y) {
            return 1;
          }
          if (x < y) {
            return -1;
          }
          return 0;
        }
        x = x.toString();
        y = y.toString();
        return x.localeCompare(y, 'zh-CN');
      })
      if ('desc' == order) {
        arr.reverse();
      }
      return arr;
    }else{
      return arr;
    }
}
  var sortArr = sort(arr, "desc", "return_value");
  sortArr.forEach(function (item, i) {
    var div = document.createElement("div");
    div.innerHTML = item.id + ":"  + item.return_value;
    document.body.appendChild(div);
  });
 

二、原因

sort排序原理:

a:"因为排序依据是相同的就是没有顺序,没有顺序就是乱序,这种结果是正确的";

b:"既然排序依据是相同的那就按照原始顺序输出"(这应该是大多数据语言里常规的做法)

经手机测试,两种手机排序不一致是因为苹果手机使用了原理b进行排序,而安卓手机使用了原理a进行排序。

三、解决

方法1:根据排序前的索引进行排序。先循环给每个元素增加一个属性,用来保存它目前的位置,然后再排序中遇到等序时取索引进行排序。参考网址:https://blog.csdn.net/qq_18145031/article/details/82500177

方法2:根据数组中的自增字段进行排序

function sort(arr, order, order_by) {
  if (order == 'asc' || order == 'desc') {
    arr.sort(function (a, b) {
      let x = a[order_by];
      let y = b[order_by];
      if (x == '--' && y != '--') {
        return 1;
      }
      if (x != '--' && y == '--') {
        return -1;
      }
      x = x.toString().replace(/,/g, '');
      y = y.toString().replace(/,/g, '');
      
      if (order == 'asc') { // 升序
        if (x == '--' && y == '--') {
          return parseInt(a.id) - parseInt(b.id)
        } else {
          if (!isNaN(parseFloat(x)) && !isNaN(parseFloat(y))) {
            return parseFloat(x) - parseFloat(y);
          }
          return x.localeCompare(y, 'zh-CN');
        }
      } else { // 降序
        if (x == '--' && y == '--') {
          return parseInt(b.id) - parseInt(a.id)
        } else {
          if (!isNaN(parseFloat(x)) && !isNaN(parseFloat(y))) {
            return parseFloat(y) - parseFloat(x);
          }
          return y.localeCompare(x, 'zh-CN');
        }
      }
    });
    return arr;
  } else {
    return arr;
  }
}
var sortArr = sort(arr, "desc", "return_value");
sortArr.forEach(function (item, i) {
  var div = document.createElement("div");
  div.innerHTML = item.id + ":" + item.name + "--" + item.return_value;
  document.body.appendChild(div);
});

sort排序在苹果与安卓端不一致问题的更多相关文章

  1. 判断苹果和安卓端或者wp端

    window.onload = function() { var u = navigator.userAgent; if(u.indexOf('Android') > -1 || u.index ...

  2. js判断苹果和安卓端或者wp端

    最近做了一个H5,说要提供一个底部,可以区分安卓或者ios,到相应的网址进行下载APP,如图: 代码如下:  window.onload = function () { var u = navigat ...

  3. sort排序出现安卓与苹果系统排序不一致问题

    sort排序出现安卓与苹果系统排序不一致问题

  4. 微软BI 之SSIS 系列 - Merge, Merge Join, Union All 合并组件的使用以及Sort 排序组件同步异步的问题

    开篇介绍 SSIS Data Flow 中有几个组件可以实现不同数据源的数据合并功能,比如 Merger, Merge Join 和 Union All.它们的功能比较类似,同时也比较容易混淆,下面是 ...

  5. 【转载】Redis sort 排序命令详解

    转载地址:http://www.jb51.net/article/69131.htm 本文介绍redis排序命令 redis支持对list,set,sorted set元素的排序 sort 排序命令格 ...

  6. 关于微信内置浏览器安卓端session丢失问题

    项目上线测试,发现微信安卓端存在用户登录无法验证session情况, 导致每次接口请求都无法识别,而苹果客户端不会出现此问题,非微信环境打开不会出现此问题,找到一些解决方案做下记录: 方案1: 由于微 ...

  7. 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用

    因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码  https ...

  8. 2.sort 排序命令讲解

    sort命令  sort:文本排序,仅仅是对显示文件的排序,而不影响源文件的顺序,是根据ASSII码     的字符升序来排列的.        -n:安装数值大小从小到大排列 ,默认是升序.     ...

  9. 反向输出及sort排序

    建立条件:#include "algorithm"引用这个头文件 1.reverse 的用法,反向排序,由自己输入5个数: 1 2 3 4 5 for (int i = 0; i ...

随机推荐

  1. 给datagridview的下拉框添加valueChange事件

    修改datagridview的EditMode属性为EdutOnEnter,否则需要点2次以上才出现下拉框 1.给DataGridView添加EditingControlShowing事件: 2.编辑 ...

  2. pip install pytest on Mac (EI Capitan 10.11.6)

    升级了Mac 系统后发现用pip安装pytest出现下面链接中的问题,解决方法是在install时候加上--user选项: 1. 切到home directory: cd - 2. install p ...

  3. 位运算练习:将整数A转换为B,需要改变多少个bit位

    思路解析: 将整数A转换为B,如果A和B在第i(0<=i<32)个位上相等,则不需要改变这个BIT位,如果在第i位上不相等,则需要改变这个BIT位.所以问题转化为了A和B有多少个BIT位不 ...

  4. 以超级管理员方式运行bat文件

    以超级管理员方式直接运行bat 脚本文件,直接上脚本代码,以下是以一个服务的安装为例子 @echo =============================== ¶¯Ì¬ÅŲú·þÎñ ===== ...

  5. Python Queue(队列)

    Queue模块实现了多生产者.多消费者队列.当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用,实现了所有必需的锁定语义. 一.该模块实现了三种类型的队列,它们的区别仅在于检索条目的顺序: ...

  6. Python PEP8 编码规范

    代码编排 缩进.缩进4个空格,不能混合使用Tab和空格. 每行最大长度79,文档字符串和注释行最大长度为72,换行可以使用反斜杠,最好使用圆括号. 类和顶层函数定义之间空两行:类中的方法定义以单行分隔 ...

  7. LeetCode 92. Reverse Linked List II倒置链表2 C++

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  8. Flask 中关于‘蓝图’ 的使用-------------------

    Blueprint是一个存储操作方法的容器,这些操作在这个Blueprint被注册到一个应用之后就可以被调用,Flask可以通过Blueprint来组织URL以及处理请求 Blueprint使用时应先 ...

  9. sqlPlus基本操作

    SQL*PLUS连接方法 1. $ sqlplus "user/password[@service] [as sysdba]" 2. $ sqlplus /nolog SQL> ...

  10. linux挂载硬盘分区

    [转]https://www.jb51.net/article/138204.htm 基本步骤:分区——格式化——挂载——写入文件 1.使用fdisk    -l命令查看添加的硬盘名称,可以看到sdb ...