一、问题

在使用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. Android Studio无法识别手机

    1.代理配置 1.1 无FQ的网络:需要配置代理: 1.2 公司网:不需要配置代理: 2.检查驱动安装情况: 2.1 检查设备管理器中的驱动是否正常安装: 成功后: 3.手机开启开发者模式

  2. ubuntu go环境安装搭建

    一.安装必备环境 sudo apt-get install git golang-go vim sublime-text-installer 如果出现安装错误,进行修复安装: sudo apt-get ...

  3. 接口与继承:方法覆盖(super)

    源代码 //父类Parent class Parent{ int x; int y; Parent() { x = ; y = ; } public void Set(int a,int b) { x ...

  4. .net 上传文件

    Controller层接收文件 参数     [FromServices] IHostingEnvironment env public IActionResult UploadFile([FromS ...

  5. 分布式系统session同步解决方案

    来源:架构师之路 session的概念 什么是session? 当浏览器端第一次访问web server时,server端会调用getSession()方法创建session对象,经过特殊算法计算出s ...

  6. [C#]位运算符

    参考链接: http://www.runoob.com/csharp/csharp-operators.html 表: 简单来说,就是: &:全1为1,否则为0 |:有1为1,否则为0 ^:不 ...

  7. 【MySQL】5.7 复制

    参考:http://www.cnblogs.com/zhoujinyi/p/5704567.html 参考:http://www.innomysql.com/article/25656.html 参考 ...

  8. Openstack EOL 版本离线安装源

    当Openstack EOL,网上的yum源无法安装openstack版本和rdo  ,则无法正常通过yum源直接安装openstack和rdo ,只是直接安装openstack后,也无法通过yum源 ...

  9. 一些常见的Java面试题 & 面试感悟

    < 前言 > 近期在面试,深感这个行业的浮躁,一些菜不辣基的弱鸡开出的工资待遇要求,超过了我.不知道他们是怎么拿到那么高的工资的,难道是他在公司有亲戚朋友吗?有后台吗?是行业热钱真的过多了 ...

  10. winreg操作windows注册表详解示例

    #coding:utf-8 #=====================================================================#=====本程序演示了WINR ...