Почему CloudKit JS sortBy возвращает другой порядок в Safari?

Я пытаюсь отразить таблицу лидеров с рекордами из моего приложения на веб-странице. Следуя старому руководству Raywenderlich, я использую 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()); 

});

1 ответ

Следуя совету user3297291 (особенно в приведенной ссылке), я изменил сортировку на следующую:

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

И это работает в обоих браузерах (Firefox и Safari).

Другие вопросы по тегам