gpt4 book ai didi

javascript - 如何在 Backbone.js/underscore.js 的比较器中实现多级排序?

转载 作者:数据小太阳 更新时间:2023-10-29 06:03:13 24 4
gpt4 key购买 nike

想象一个像这样的模型/集合:

var AModel = Backbone.Model.extend({
defaults: {
a: 'a string',
b: 'another string',
c: 'yet another string'
}
});

var ACollection = Backbone.Collection.extend({
model: AModel,
comparator: function(amodel) {
...
}
});

如何编写比较器来实现多级排序?我想按 AModela 属性排序,然后按其 b 属性排序,然后按其 c 属性。

我拼凑了一个看起来像这样的比较器,但我想知道是否有更好/更智能的方法?

comparator: function(amodel) {
var s = '',
assumed_max_length_of_any_attribute = 30;

s += amodel.get('a');
while (s.length < assumed_max_length_of_any_attribute) {
s += ' ';
}

s += amodel.get('b');
while (s.length < assumed_max_length_of_any_attribute) {
s += ' ';
}

s += amodel.get('c');
while (s.length < assumed_max_length_of_any_attribute) {
s += ' ';
}

return s;
}

然后,s 会被适本地填充空格,并且应该按“词汇”顺序排列多个级别。但与 python 的稳定多级排序之美相比,这一切都让人感觉非常粗鲁(如果以上在 python 中有类似的等价物的话):

collection.sort(key=lambda x: x.get('c'))
collection.sort(key=lambda x: x.get('b'))
collection.sort(key=lambda x: x.get('a'))

有没有更好的办法?

最佳答案

Backbone 文档说:

Comparator function can be defined as either a sortBy (pass a function that takes a single argument), or as a sort (pass a comparator function that expects two arguments).

http://documentcloud.github.com/backbone/#Collection-comparator

您可以使用第二种方式,根据给定的两个元素进行比较。

也许是这样的:

helper: function (c1, c2) {
if (c1 < c2) return -1;
if (c1 > c2) return +1;
return 0;
}
comparator: function (model1, model2) {
return _.reduce(["c", "b", "a"], function (acc, comp) {
return acc !== 0 ? acc : this.helper(model1[comp], model2[comp])
}, 0);
}

关于javascript - 如何在 Backbone.js/underscore.js 的比较器中实现多级排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com