Backbone.js collection comparator sort by multiple fields?

后端 未结 5 1341
臣服心动
臣服心动 2020-12-14 06:11
  this.col = Backbone.Collection.extend({
    model: M,
    comparator: function(item) {
      return item.get(\"level\");
    }
  });

This above c

5条回答
  •  借酒劲吻你
    2020-12-14 06:33

    "inspired" in hyong answer.

    This also allows you to change the data before compare it, valueTransforms is an object, if there is an attribute in that object that has a function, it will be used.

        /*
         * @param {Object} sortOrders ie: 
         * {
         *     "description": "asc",
         *     "duedate": "desc",
         * }
         * @param {Object} valueTransforms
         */
        setMultiFieldComparator: function(sortOrders, valueTransforms) {
            var newSortOrders = {}, added = 0;
            _.each(sortOrders, function(sortOrder, sortField) {
                if (["asc", "desc"].indexOf(sortOrder) !== -1) {
                    newSortOrders[sortField] = sortOrder;
                    added += 1;
                }
            });
            if (added) {
                this.comparator = this._multiFieldComparator
                    .bind(this, newSortOrders, valueTransforms || this.model.prototype.valueTransforms || {});
            } else {
                this.comparator = null;
            }
        },
    
        _multiFieldComparator: function(sortOrders, valueTransforms, one, another) {
            var retVal = 0;
            if (sortOrders) {
                _.every(sortOrders, function(sortOrder, sortField) {
                    var oneValue = one.get(sortField),
                        anotherValue = another.get(sortField);
                    if (valueTransforms[sortField] instanceof Function) {
                        oneValue = valueTransforms[sortField](oneValue);
                        anotherValue = valueTransforms[sortField](anotherValue);
                    }
                    if (oneValue > anotherValue) {
                        retVal = ("desc" !== sortOrder) ? 1 : -1;
                    } else if (oneValue < anotherValue) {
                        retVal = ("desc" !== sortOrder) ? -1 : 1;
                    } else {
                        //continue
                        return true;
                    }
                });
            }
            return retVal;
        },
    

提交回复
热议问题