我需要对一个数组执行排序,如果两个元素相等,那么我需要对这些元素中的另一个键执行二次排序.看看有关array.sort的Mozilla开发者网络文档,底部的代码有一个很好的片段来处理第一种类型.我喜欢它,因为它简洁明了,并展示了如何编写功能强大的JS.
以下是我根据MDN的代码尝试的内容.这正确地做了第一种.
// the array to be sorted var list = [{name:'Delta', ref: 456}, {name:'Delta', ref: 123}, {name:'alpha', ref: 789}, {name:'CHARLIE', ref: 012}, {name:'bravo', ref: 345}]; // temporary array holds objects with position and sort-value var mapped = list.map(function (el, i) { return { index: i, value: el.name.toLowerCase(), secondaryValue: el.ref }; }); // sorting the mapped array containing the reduced values mapped.sort(function (a, b) { return +(a.value > b.value) || +(a.value === b.value) - 1; }); // container for the resulting order var result = mapped.map(function (el) { return list[el.index]; }); console.log(list); console.log(result);
现在我知道我可以像这样修改比较函数来完成二级排序的要求:
// sorting the mapped array containing the reduced values mapped.sort(function (a, b) { if (a.value === b.value){ return +(a.secondaryValue > b.secondaryValue) || +(a.secondaryValue === b.secondaryValue) - 1; } return +(a.value > b.value) || - 1; });
但是,对我来说,这会失去一些魅力return +(a.value > b.value) || +(a.value === b.value) - 1;
- 在我看来这很酷.
问题:是否有更优雅的方式来执行二级排序?
限制:仅限纯JS.ES5兼容,但有兴趣听听ES6是否可以提供帮助.
您可以将排序比较与逻辑或链接起来||
,因为对相同的值求值0
并且那是虚假的,因此对下一部分进行求值。
mapped.sort(function (a, b) { return (+(a.value > b.value) || +(a.value === b.value) - 1) || (+(a.secondaryValue > b.secondaryValue) || +(a.secondaryValue === b.secondaryValue) - 1); });
还是使用以上比较紧凑的版本
mapped.sort(function (a, b) { return (+(a.value > b.value) || +(a.value === b.value) - 1) || (+(a.secondaryValue > b.secondaryValue) || +(a.secondaryValue === b.secondaryValue) - 1); });