0

我有数组对象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
}]
4

3 回答 3

2

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

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

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

于 2013-08-14T03:16:15.337 回答
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(say 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/

于 2013-08-14T04:29:29.967 回答
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);

检查这个小提琴

于 2016-05-17T15:11:42.180 回答