JavaScript按多个(数字)字段对数组排序

JavaScript按多个(数字)字段对数组排序,javascript,json,sorting,Javascript,Json,Sorting,我如何实现一个 ORDER BY sort1 DESC, sort2 DESC JSON数组中的逻辑如下: var items = '[ { "sort1": 1, "sort2": 3, "name" : "a", }, { "sort1": 1, "sort2": 2, "nam

我如何实现一个

 ORDER BY sort1 DESC, sort2 DESC
JSON数组中的逻辑如下:

    var items = '[
          {
            "sort1": 1,
            "sort2": 3,
            "name" : "a",
          },
          {
            "sort1": 1,
            "sort2": 2,
            "name" : "b",
          },
          {
            "sort1": 2,
            "sort2": 1,
            "name" : "c",
          }
    ]';
产生了新的秩序:

b,a,c

您应该相应地设计排序功能:

items.sort(function(a, b) {
  return a.sort1 - b.sort1  ||  a.sort2 - b.sort2;
});
(因为
|
运算符的优先级低于
-
运算符,所以这里不必使用括号)

逻辑很简单:如果
a.sort1-b.sort1
表达式的计算结果为0(因此这些属性相等),它将继续计算
|
表达式,并返回
a.sort2-b.sort2
的结果

作为旁注,您的
items
实际上是一个字符串文本,您必须
JSON.parse
才能获得数组:

const itemstr=`[{
“sort1”:1,
“sort2”:3,
“名称”:“a”
},
{
“sort1”:1,
“sort2”:2,
“名称”:“b”
},
{
“sort1”:2,
“sort2”:1,
“名称”:“c”
}
]`;
const items=JSON.parse(itemstr);
排序((a,b)=>a.sort1-b.sort1 | | a.sort2-b.sort2);

控制台日志(项目)您可以通过创建一个通用函数来避免硬编码

function sortByMultipleKey(keys) {
    return function(a, b) {
        if (keys.length == 0) return 0; // force to equal if keys run out
        key = keys[0]; // take out the first key
        if (a[key] < b[key]) return -1; // will be 1 if DESC
        else if (a[key] > b[key]) return 1; // will be -1 if DESC
        else return sortByMultipleKey(keys.slice(1))(a, b);
    }
}
我要你

[ { sort1: 1, sort2: 2, name: 'b' },
  { sort1: 1, sort2: 3, name: 'a' },
  { sort1: 2, sort2: 1, name: 'c' } ]
const itemstr=`[{
“sort1”:1,
“sort2”:3,
“名称”:“a”
},
{
“sort1”:1,
“sort2”:2,
“名称”:“b”
},
{
“sort1”:2,
“sort2”:1,
“名称”:“c”
}
]`;
const items=JSON.parse(itemstr);
排序((a,b)=>a.sort1-b.sort1 | | a.sort2-b.sort2);

控制台日志(项目)
为什么要将数组语法放在(断开的)字符串文字语法中?我是这样使用JSON的,有没有更好的方法?因为要将数组分配给
items
变量,您已经处于JavaScript环境中,所以首先将其表示为JSON标记,然后解析它没有太大意义。如果这是为了表示从服务器发送的JSON标记,那么更好的表示方法是去掉额外的
var items=语法,只需将其显示为标记,并说明这是您的服务器端标记。可能重复使用运算符
-
,可能会导致问题,因为值可能是字符串。恐怕您在注释和回答中都忽略了这一点。使用
-
而不是
,这正是我要说的只适用于数字。我不是说你错了。正如我在回答中所说,我正在提供一个通用的解决方案。
-仅适用于数字
-不,它不是。”12'-'3'的计算结果为9(>0),将前一个操作数放高。'12'<'3'的计算结果为
true
,顺序相反。请记住,显式优于隐式。如果希望在任何情况下将值作为字符串进行比较,请改用<很抱歉,这个泛型函数的实现效率太低了。不仅这里使用递归是可疑的(您可以在键列表上迭代,直到比较结果为非零),对于每个“比较未命中”,都会生成一个新的比较函数实例。例如,将您的代码与进行比较。
[ { sort1: 1, sort2: 2, name: 'b' },
  { sort1: 1, sort2: 3, name: 'a' },
  { sort1: 2, sort2: 1, name: 'c' } ]