[bug] JS sort 函数在 ios 中无效

413 阅读2分钟

搞vue项目时遇到这个问题,特此记录下。

问题:

后端返给我的排期列表没有根据放映时间进行排序,数据是一个对象数组。接收到数据后我用sort()对数据根据放映时间进行了排序,发现android展示正常,ios还是乱序。ios展示如下

419a419ae3b5716a53dde078054507e.jpg

      //原先的代码
      //按时间排序
      let desc = function (a, b) {
        return  Date.parse(a["startTime"]) - Date.parse(b["startTime"]);
      };
      let arr = this.indexMovieList.plan[this.startDate];
      this.indexMovieList.plan[this.startDate] = arr.sort(desc);

修复:

使用 localeCompare() 方法进行字符串比较

语法

stringObject.localeCompare(target)
参数描述
target要以本地特定的顺序与 stringObject 进行比较的字符串。

返回值

说明比较结果的数字。如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。如果 stringObject 大于 target,则该方法返回大于 0 的数。如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。

说明

把 < 和 > 运算符应用到字符串时,它们只用字符的 Unicode 编码比较字符串,而不考虑当地的排序规则。以这种方法生成的顺序不一定是正确的。例如,在西班牙语中,其中字符 “ch” 通常作为出现在字母 “c” 和 “d” 之间的字符来排序。

localeCompare() 方法提供的比较字符串的方法,考虑了默认的本地排序规则。ECMAscript 标准并没有规定如何进行本地特定的比较操作,它只规定该函数采用底层操作系统提供的排序规则。

实例

在本例中,我们将用本地特定排序规则对字符串数组进行排序:

var str;
str.sort (function(a,b){return a.localeCompare(b)})

修复后的代码

      //修复后的代码
      //按时间排序
      let desc = function (a, b) {
        return a["startTime"].localeCompare(b["startTime"])
      };
      let arr = this.indexMovieList.plan[this.startDate];
      this.indexMovieList.plan[this.startDate] = arr.sort(desc);