【问题标题】:Why does CloudKit JS "sortBy" return a different order on Safari?为什么 CloudKit JS“sortBy”在 Safari 上返回不同的顺序?
【发布时间】:2022-01-17 10:13:52
【问题描述】:

我正在尝试在网页上反映我的应用程序中的高分排行榜。继旧的raywenderlich tutorial 之后,我正在使用 CloudKit JS 和 Knockout 来完成此任务。 当然,我想按分数从高到低排序。

教程中的示例代码使用:

var query = { recordType: 'CD_FinalScore', sortBy: [{ fieldName: 'CD_score'}] };

(当然,我为示例插入了我的 recordType 和 fieldName。)这并没有给我想要的结果,所以我在查询获取的记录上添加了一个排序方法:

self.items(records.sort(function(a, b){return b - a}));

这给了我在 Firefox 上想要的结果,但在 Safari 上却没有(顺序相反)。 我的直觉告诉我,我需要关注查询签名。 有人可以告诉我我做错了什么或不完整吗?谢谢! 作为参考,完整的 Knockout 视图模型代码在这里:

function LeaderboardViewModel() {
    var self = this;
    var container = CloudKit.getDefaultContainer();
    var publicDB = container.publicCloudDatabase;
    self.items = ko.observableArray();
    self.fields = ko.observable('');
    self.fields.CD_score = ko.observable('');
    self.fields.CD_userName = ko.observable('');
    self.fields.CD_submitDate = ko.observable('');

    self.fetchRecords = function() {
      var query = { recordType: 'CD_FinalScore', sortBy: { fieldName: 'CD_score' } };
     
      // Execute the query.
      return publicDB.performQuery(query).then(function(response) {
        if(response.hasErrors) {
          console.error("response errors: " + response.errors[0]);
          return;
        }
       var records = response.records;
        var numberOfRecords = records.length;
        if (numberOfRecords === 0) {
          console.error('No matching items');
          return;
        }
        //self.items(records); // this is per the original, tutorial
        self.items(records.sort(function(a, b){return b - a}));
      });
    };

      container.setUpAuth().then(function(userInfo) {
      console.log("setUpAuth");
      self.fetchRecords(); 
      });
  }
  ko.applyBindings(new LeaderboardViewModel()); 

});

【问题讨论】:

  • Safari 的结果是什么?
  • 相同的结果只是以相反的顺序(从最低到最高)。
  • 假设records 是一个普通对象数组,b - a 比较将返回NaN可能 Safari 处理这些的方式与 Firefox 不同(传递给 sort 的比较函数应该返回一个数字)。您能否给我们一个您的数据示例,以便我们尝试重现?
  • P.S.感觉你正在使用的这个 API 应该负责排序。但如果你想在客户端做,这里是a QA about sorting arrays of objects by one of their properties
  • 抱歉回复晚了.. 数据返回如下: 'code'{"items": [ {"recordName":"A0EAC4B5-DBDD-9DD8-6C13-5765C6CBFF64", "recordType ":"CD_FinalScore", "fields": {"CD_score": {"value":200, "type":"INT64"}, "CD_submitDate": {"value":1639153595598, "type":"TIMESTAMP"} , "CD_userIdentifier": {"value":"0001", "type":"STRING"}, "CD_userName": {"value":"SomeoneElse", "type":"STRING"} }, ] } '代码'

标签: knockout.js cloudkit-js


【解决方案1】:

根据user3297291 的建议(特别是在提供的链接中),我将排序更改为以下内容:

self.items(records.sort(function(a, b) {
          return parseFloat(b.fields.CD_score.value) - parseFloat(a.fields.CD_score.value);
        }));

这似乎适用于两种浏览器(Firefox 和 Safari)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2014-10-01
    • 2013-11-18
    • 2022-06-11
    • 1970-01-01
    • 2018-12-13
    • 2012-02-25
    相关资源
    最近更新 更多