2017-01-25 15 views
0

Я создал модель в Appcelerator, которая имеет методы сортировки. Одним из свойств (date) является строка, содержащая только числа. Мне нужно отсортировать это по возрастанию или по порядку смерти, как если бы это было целое число. Однако, поскольку поле является отметкой времени даты в формате UTC, иногда более старые даты имеют меньше цифр и начинаются с большего числа, поэтому они должны быть наверху при сортировке по последнему слову или внизу при сортировке по самому старому.Модели аппликации титана/сплава: как мне изменить этот метод сортировки для сортировки строки, содержащей цифры

Вот моя модель файл:

exports.definition = { 
    config: { 
     columns: { 
      "name": "text", 
      "rating": "integer", 
      "location": "text", 
      "notes": "text", 
      "date": "text", 
      "latitude": "integer", 
      "longitude": "integer", 
      "api_id": "text" 
     }, 
     adapter: { 
      type: "sql", 
      collection_name: "test" 
     } 
    }, 
    extendModel: function(Model) { 
     _.extend(Model.prototype, { 
      // extended functions and properties go here 
     }); 
     return Model; 
    }, 
    extendCollection: function(Collection) { 
     _.extend(Collection.prototype, { 
      // extended functions and properties go here 
      initialize: function() { 
       this.sortField = "date"; 
       this.sortDirection = "DESC"; 
      }, 
      comparator: function (collection) { 
       var that = this; 
       return collection.get(that.sortField); 
      }, 
      setSortField: function (field, direction) { 
       this.sortField = field; 
       this.sortDirection = direction; 
      }, 
      sortBy: function (iterator, context) { 
       var obj = this.models; 
       var direction = this.sortDirection; 

       return _.pluck(_.map(obj, function (value, index, list) { 
        return { 
         value: value, 
         index: index, 
         criteria: iterator.call(context, value, index, list) 
        }; 
       }).sort(function (left, right) { 
        // swap a and b for reverse sort 
        var a = direction === "ASC" ? left.criteria : right.criteria; 
        var b = direction === "ASC" ? right.criteria : left.criteria; 

        if (a !== b) { 
         if (a > b || a === void 0) return 1; 
         if (a < b || b === void 0) return -1; 
        } 
        return left.index < right.index ? -1 : 1; 
       }), 'value'); 
      } 
     }); 
     return Collection; 
    } 
}; 

Вот код в моем index.js, что сортирует пиво

theBeers.setSortField("date", "ASC"); 
theBeers.sort(); 

Как я могу изменить код выше, чтобы исправить Эта проблема?

Голые в виду, что я все еще нужны другие свойства, строки должны быть отсортированы в обычном режиме, как, например, namelocation и т.д.

ответ

1

Лучший способ, чтобы преобразовать дату в целое число перед сравнением, положить просто:

Вы должны объявить локальную переменную для поля сортировки, так же как направление:

var field = this.sortField; 

Непосредственно перед, если заявление, добавить следующее:

if (field == "date") { 
    a = parseInt(a); 
    b = parseInt(b); 
} 

Возможно, вам потребуется добавить проверку на отсутствие у вас в коде кода.

Так полный ответ:

sortBy: function (iterator, context) { 
      var obj = this.models; 
      var direction = this.sortDirection; 
      var field = this.sortField; 

      return _.pluck(_.map(obj, function (value, index, list) { 
       return { 
        value: value, 
        index: index, 
        criteria: iterator.call(context, value, index, list) 
       }; 
      }).sort(function (left, right) { 
       // swap a and b for reverse sort 
       var a = direction === "ASC" ? left.criteria : right.criteria; 
       var b = direction === "ASC" ? right.criteria : left.criteria; 

       if (field == "date") { 
        a = parseInt(a); 
        b = parseInt(b); 
       } 

       if (a !== b) { 
        if (a > b || a === void 0) return 1; 
        if (a < b || b === void 0) return -1; 
       } 
       return left.index < right.index ? -1 : 1; 
      }), 'value'); 
     } 
+0

Я понимаю концепцию Вашего ответа, но как я могу узнать, что поле '«дата»' в 'функции sortBy' моего кода? Я не знаю, как получить эту информацию. – shrewdbeans

+0

Я думал, что объяснил, что вот полная функция: – Larrie