我有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
}]
答案 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
是一种标志性的便利,你不必强迫一切都适合你手头的任何便利。
答案 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。