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' } ]