Javascript 下划线中的多重排序
我有数组对象Javascript 下划线中的多重排序,javascript,sorting,underscore.js,Javascript,Sorting,Underscore.js,我有数组对象arObject object = { Active: true, // type: boolean Code: '12345' // type: string } 我想按Active字段然后按code对该数组进行排序。我需要帮助才能使用下划线js实现这一点 更新 我的数据: data = [ { Code: "Code0", Description: "Description0", IsActive: true, id: 0 }
arObject
object = {
Active: true, // type: boolean
Code: '12345' // type: string
}
我想按Active
字段然后按code
对该数组进行排序。我需要帮助才能使用下划线js
实现这一点
更新
我的数据:
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 sorted = _.sortBy(ListObject, function (o) {
return o.Active.toString() + '_' + o.Code;
});
(基于
“True”>“False”True>False
)比较器可以基于如下连接的两个字段
var sorted = _.sortBy(ListObject, function (o) {
return o.Active.toString() + '_' + o.Code;
});
(基于“True”>“False”True>False
)我只想使用一个简单的比较器函数:
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);
}
如果您需要能够切换code
排序顺序,那么您只需要一个反向版本的cmp\u str
(比如cmp\u str\u reverse
)和一个使用cmp\u str\u reverse
而不是cmp\u str
的cmp
如果必须使用,则只需拿出一个值进行排序,如下所示:
function combined(obj) {
return (obj.IsActive ? 'a' : 'b')
+ obj.Code;
}
var sorted = _(data).sortBy(combined);
问题是要颠倒code
顺序要困难得多。我想你可以在字符串的字符上做一大堆的小动作,但那只会让你在六个月后看代码的时候想知道自己在做什么<代码>\因此是一种符号化的便利,您不必强迫所有东西都符合手头的任何便利条件
演示:我只想使用一个简单的比较器函数:
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);
}
如果您需要能够切换code
排序顺序,那么您只需要一个反向版本的cmp\u str
(比如cmp\u str\u reverse
)和一个使用cmp\u str\u reverse
而不是cmp\u str
的cmp
如果必须使用,则只需拿出一个值进行排序,如下所示:
function combined(obj) {
return (obj.IsActive ? 'a' : 'b')
+ obj.Code;
}
var sorted = _(data).sortBy(combined);
问题是要颠倒code
顺序要困难得多。我想你可以在字符串的字符上做一大堆的小动作,但那只会让你在六个月后看代码的时候想知道自己在做什么<代码>\因此是一种符号化的便利,您不必强迫所有东西都符合手头的任何便利条件
演示:有点晚了,但如果真的需要下划线,可能有人需要这个答案
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);
检查此项。有点晚了,但如果确实需要下划线,可能有人需要此答案
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);
检查此项。您可以使用该函数并传入迭代器函数。使用普通JavaScript数组
排序
调用适当的比较器函数有什么问题?抱歉,杰克,我的错误,它是数组,而不是列表,所以不能使用排序
@mu太短了:可能一些老浏览器不支持它,我试着让它在所有浏览器中都能工作。我从来没有听说过这样的浏览器。和.sortBy
只是Schwartzian变换和标准数组#sort
调用的组合。您可以使用该函数并传入迭代器函数。使用普通JavaScript数组sort
调用和适当的比较器函数有什么不对?抱歉,Jack,我的错误,它是数组,而不是列表,所以不能使用sortBy
@mu太短了:也许一些老浏览器不支持它,我试着让它在所有浏览器中都能工作。我从来没有听说过这样的浏览器。和。
排序只是施瓦茨变换和标准数组#排序
调用的组合。为什么要按“true…”
和“false…”
排序?这似乎是个坏主意。首先将布尔值转换为整数可能是一个更好的主意。@muistooshort为什么不好?我希望它是按值排序的,toString()
在这里不是解决方案。@stiger为什么?它们是等价的。“True”>“False”True>False我尝试与所有值类型一样进行排序。为什么要按“True…”
和“False…”
进行排序?这似乎是个坏主意。首先将布尔值转换为整数可能是一个更好的主意。@muistooshort为什么不好?我希望它是按值排序的,toString()
在这里不是解决方案。@stiger为什么?它们是等价的。“True”>“False”True>False我尝试与所有值类型共同执行此操作。