一、问题

在使用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. 64 位 Windows 平台开发注意要点之文件系统重定向

    Program Files 的重定向 很多开发人员都知道,在 64 位 Windows 系统上,32 位程序是无法获取得到 C:\Program Files 的完整路径的,只能获取到 C:\Progr ...

  2. (转)并发编程 – Concurrent 用户指南

    原文出处: 高广超 译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/in ...

  3. Python课程第五天作业

    1.利用字典推导式和列表推导式完成数据的相互转化: dic = {'name': 'Owen', 'age': 18, 'gender': '男'} ls = [('name', 'Owen'), ( ...

  4. 使用Git将本地文件提交到远程仓库

    一 操作准备条件: git远程仓库已经建好了,本地文件已经存在了,现在要将本地代码推到git远程仓库保存. 解决办法如下: 1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以 ...

  5. 基于vue和svg的树形UI

      vue-svg-tree 基于vue和svg的动态树形UI 截图 应用 npm install vue-svg-tree 示例 <template> <div> <v ...

  6. 微信小程序支付+php后端

    最近在做自有项目后端用的是thinkphp5.1框架,闲话不说直接上代码 小程序代码 wxpay: function(e){ let thisid = e.currentTarget.dataset. ...

  7. Revit 模态框

    非模态窗口有一个好处,就是可以一直停留在程序之前,然后持续完成操作.但是在Revit二次开发中,非模态窗口也有几个注意事项. 1.需要在文档关闭的时候,把非模态窗口也关闭掉,不然会导致文档关闭,窗口还 ...

  8. oracle入坑日记<四>表空间

    1   表空间是什么 1.1.数据表看做的货品,表空间就是存放货品的仓库.SQLserver 用户可以把表空间看做 SQLserver 中的数据库. 1.2.引用[日记二]的总结来解释表空间. 一个数 ...

  9. Burpsuite Sqlmap Nmap入门总结

    burpsuite sqlmap nmap 简介 sqlmap基础 五种独特sql注入技术: 基于布尔类型的盲注 基于时间的盲注 基于报错注入 联合查询注入 堆查询注入 sqlmap入门 1.判断是否 ...

  10. 0 Python学习计划

    每天一小节,坚持水滴石穿. 2019-4-1 景略