当前位置:  开发笔记 > 编程语言 > 正文

数组的更优雅的二级排序

如何解决《数组的更优雅的二级排序》经验,为你挑选了1个好方法。

我需要对一个数组执行排序,如果两个元素相等,那么我需要对这些元素中的另一个键执行二次排序.看看有关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是否可以提供帮助.



1> Nina Scholz..:

您可以将排序比较与逻辑或链接起来||,因为对相同的值求值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);
});
推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有