Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下划线中的多重排序_Javascript_Sorting_Underscore.js - Fatal编程技术网

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我尝试与所有值类型共同执行此操作。