下划线中的多重排序

时间:2013-08-14 02:59:03

标签: javascript sorting underscore.js

我有Array对象ArrObject

object = {
    Active: true, // type: boolean
    Code: '12345'   // type: string
}

我想按Active字段然后Code对此数组进行排序。我需要帮助才能使用underscoreJs

更新

我的数据:

data = [
{
    Code: "Code0",
    Description: "Description0",
    IsActive: true,
    id: 0
},
{
    Code: "Code1",
    Description: "Description1_edit",
    IsActive: true,
    id: 1
},
{
    Code: "Code5",
    Description: "Description5_edit",
    IsActive: false,
    id: 2
}]

3 个答案:

答案 0 :(得分:2)

比较器可以基于像这样的连接2字段

var sorted = _.sortBy(ListObject, function (o) {
    return o.Active.toString() + '_' + o.Code;
});

(基于"True" > "False" <=> true > false

答案 1 :(得分:2)

我只使用Array#sort和一个简单的比较器函数:

function cmp_bool(a, b) {
    return a == b ?  0
         : a      ? -1
         :          +1
}
function cmp_str(a, b) {
    return a == b ?  0
         : a <  b ? -1
         :          +1
}
function cmp(a, b) {
    return cmp_bool(a.IsActive, b.IsActive)
        || cmp_str( a.Code,     b.Code);
}

然后你可以这样做:

var sorted = data.sort(cmp);

如果您需要切换Code排序顺序,那么您只需要cmp_str的反转版本(例如cmp_str_reverse)和版本cmp使用cmp_str_reverse代替cmp_str

如果你必须使用_.sortBy,那么你只需要提出一个值来排序,如下所示:

function combined(obj) {
    return (obj.IsActive ? 'a' : 'b')
         +  obj.Code;
}
var sorted = _(data).sortBy(combined);

这个问题是,反转Code排序要困难得多。我想你可能会对字符串的字符做一点点麻烦但这只会让你想知道你在六个月内查看代码时你正在做什么。 _.sortBy是一种标志性的便利,你不必强迫一切都适合你手头的任何便利。

演示:http://jsfiddle.net/ambiguous/6tfcQ/

答案 2 :(得分:1)

有点晚了,但如果确实需要下划线,也许有人需要这个答案。

data = [
{
    Code: "Code0",
    Description: "Description0",
    IsActive: true,
    id: 0
},
{
    Code: "Code1",
    Description: "Description1_edit",
    IsActive: true,
    id: 1
},
{
    Code: "Code5",
    Description: "Description5_edit",
    IsActive: false,
    id: 2
}];

var sortedData = _(data).chain()
    .sortBy('Code')
  .sortBy(function(item){
        return item.IsActive ? 0 : 1;
    });

console.log(sortedData);

选中fiddle