【问题标题】:Array sorting alphabetically within another value sort in Javascript数组在Javascript中的另一个值排序中按字母顺序排序
【发布时间】:2017-07-14 12:42:16
【问题描述】:

也许我以错误的方式问这个问题,但无法从互联网上弄清楚。

我有一个员工数组,可以按各种值(例如职位、部门)进行排序。

有许多具有相同价值观的员工(例如,许多调酒师或许多从事宾客服务的人)。

因此,我需要将这些子组(所有调酒师或所有宾客服务人员或其他人)按姓氏字母顺序排序(理想情况下,然后是组内具有相同姓氏的人,进一步按名字排序)。

这是我的排序目前的样子:

  const sorted = state.employees.sort(function(a, b) {
    if (a[filterValue] === b[filterValue]) {
      let alphaA = a.lastName, alphaB = b.lastName;
      return alphaA < alphaB ? -1 : alphaA > alphaB ? 1 : 0;
    }
    return a[filterValue] > b[filterValue] ? 1 : -1;
  });

但是,返回的数组会混淆,并在每次点击时返回不同的顺序,如下所示:

并且没有实现 asc/desc 逻辑,因此理论上,多次单击应该返回相同的排序数组,而不是按不同顺序返回一个。

这可能是因为按字母顺序比较的不是整个匹配值组(全部在住宿部门),而是直接值,但我不确定这是问题所在,完全不确定如何解决。

感谢您完成任务的帮助,但非常感谢您的解释,因为我显然不完全了解排序的工作原理。

非常感谢!

【问题讨论】:

  • 您可能需要澄清您的filterValue。您是 1) 按类别按字母顺序排序,然后 2) 按名字和姓氏排序吗?
  • 需要贴出调用排序函数的代码,见How to create a minimal, complete and verifiable example。发布动画 GIF 有点无意义和烦人。
  • 嗨,@SeanKwon!是的,所以 filterValue 类似于“部门”或“职位”,应该按字母顺序排序(调酒师,然后是厨师,然后是礼宾)。然后在这种排序中(例如,所有调酒师),这些项目应该按姓氏的字母顺序排序。
  • 当我把这段代码放到一个演示中时,它工作得很好。 repl.it/FvpL/0
  • be-nice,您不是唯一阅读此内容的人。考虑编辑您的评论。

标签: javascript arrays sorting


【解决方案1】:
var filterValue = 'department' // using a dummy one for now


state.employees.sort(function(a, b){
    if (a[filterValue] > b[filterValue]) return 1;
    if (a[filterValue] < b[filterValue]) return -1;
    //check your filters
    if (a.lastname < b.lastname ) return -1;
    if (a.lastname > b.lastname ) return 1;
    //then check their last names
    if (a.firstname < b.firstname ) return -1;
    if (a.firstname > b.firstname ) return 1;
    //then check their first names
    return 0;
});

这是我的演示:https://jsfiddle.net/zjhs20vz/

这是假设我正确回答了您的问题。根据这个逻辑漏斗从排序过滤器中排序是有意义的,然后如果它们相等,然后到姓氏,然后到名字

【讨论】:

  • 是的,是的,这太棒了!非常感谢!
  • 除了添加 firstname 检查之外,这在功能上与 OP 中发布的内容有何不同?
  • @EvanTrimboli 诚实的回答,几乎是重写。至少,imo 更容易理解,尽管该函数通过 if 语句具有错误的格式。你是对的,因为她缺少的所有功能就是名字检查。
  • 对,如果你从 OP 中换入比较器函数,它会产生相同的结果(除了名字)。您发布的内容没有问题,但我看不出它是如何回答问题的。
  • 我不知道——也从上面的 cmets 添加了 .slice() ,但这没有影响(结果与没有相同)。没有其他任何改变,但这种方式有效,而另一种方式(即使是名字)会导致随机重新排序。
【解决方案2】:

您可以考虑使用预先存在的库,例如thenBy,而不是制作自己的比较器函数。它允许您使用如下符号按多个属性排序:

state.employees.sort(firstBy('position').thenBy('lastName').thenBy('firstName'));

您显然必须根据自己的需要使用它并相应地重新设置排序,但它应该使您不必实现自己的版本

【讨论】:

  • 谢谢你,@Pabs123!最终得到了上述答案,因为 thenBy 说它可能有点重,我正在处理一个大型数据集,但仍然非常有用!
  • 没问题!我只是想提供一条替代路线,希望它对将来的人有所帮助:)
猜你喜欢
  • 2018-02-02
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多