使用 .localeCompare() 的双数组对象的 JavaScript 自定义 .sort() 不起作用

问题描述 投票:0回答:1

我正在研究 leetcode 问题的解决方案(https://leetcode.com/problems/sender-with-largest-word-count/),当我遇到一个场景时,我花了几个小时尝试调试,但仍然无法解决“不知道发生了什么事。为了简化,给定一个对象:

let items = [
  [ 'K', 4 ],           [ 'kFIbpoFxn', 10 ],  [ 'yErgn', 6 ],
  [ 'N', 8 ],           [ 'wtJesr', 9 ],      [ 'rusffeL', 14 ],
  [ 'KlpoodEd', 5 ],    [ 'qGcQqIVdFr', 1 ],  [ 'ztmCdK', 10 ],
  [ 'HFILjKln', 12 ],   [ 'TmmQZ', 18 ],      [ 'R', 7 ],
  [ 'CNh', 7 ],         [ 'YMQDBkOWy', 22 ],  [ 'kjiSc', 4 ],
  [ 'cGMsZxxx', 6 ],    [ 'PPqsmNBewN', 21 ], [ 'gbtn', 10 ],
  [ 'nQNcL', 8 ],       [ 'rK', 10 ],         [ 'ppr', 16 ],
  [ 'LhSVp', 11 ],      [ 'Ub', 7 ],          [ 'QGRFMLY', 11 ],
  [ 'SdDObYkD', 9 ],    [ 'q', 3 ],           [ 'suAakSCuHz', 6 ],
  [ 'dnzhjdwrEt', 8 ],  [ 'ubIEXAO', 22 ],    [ 'EsBuLal', 11 ],
  [ 'xlQqQRrdTv', 12 ], [ 'mWxCG', 8 ],       [ 'DmwIEmS', 5 ],
  [ 'nBQLLS', 6 ],      [ 'QhF', 4 ],         [ 'bmtYQKYv', 5 ],
  [ 'PRiNk', 7 ],       [ 'QyYJw', 7 ],       [ 'QIFauTN', 3 ],
  [ 'zJLcUq', 13 ],     [ 'TU', 1 ],          [ 'lCkGjDY', 7 ],
  [ 'A', 6 ]
]

我尝试首先根据最大整数对其进行排序,但如果这些值相等,则按最大字典值排序,即 JS 默认情况下如何对字符串进行排序的 .reverse()

我的排序代码是:

items.sort(function(a, b) {
  return b[1] !== a[1] ? b[1] - a[1] : -a[0].localeCompare(b[0]);
});

导致:

[
  [ 'YMQDBkOWy', 22 ], [ 'ubIEXAO', 22 ],    [ 'PPqsmNBewN', 21 ],
  [ 'TmmQZ', 18 ],     [ 'ppr', 16 ],        [ 'rusffeL', 14 ],
  [ 'zJLcUq', 13 ],    [ 'xlQqQRrdTv', 12 ], [ 'HFILjKln', 12 ],
  [ 'QGRFMLY', 11 ],   [ 'LhSVp', 11 ],      [ 'EsBuLal', 11 ],
  [ 'ztmCdK', 10 ],    [ 'rK', 10 ],         [ 'kFIbpoFxn', 10 ],
  [ 'gbtn', 10 ],      [ 'wtJesr', 9 ],      [ 'SdDObYkD', 9 ],
  [ 'nQNcL', 8 ],      [ 'N', 8 ],           [ 'mWxCG', 8 ],
  [ 'dnzhjdwrEt', 8 ], [ 'Ub', 7 ],          [ 'R', 7 ],
  [ 'QyYJw', 7 ],      [ 'PRiNk', 7 ],       [ 'lCkGjDY', 7 ],
  [ 'CNh', 7 ],        [ 'yErgn', 6 ],       [ 'suAakSCuHz', 6 ],
  [ 'nBQLLS', 6 ],     [ 'cGMsZxxx', 6 ],    [ 'A', 6 ],
  [ 'KlpoodEd', 5 ],   [ 'DmwIEmS', 5 ],     [ 'bmtYQKYv', 5 ],
  [ 'QhF', 4 ],        [ 'kjiSc', 4 ],       [ 'K', 4 ],
  [ 'QIFauTN', 3 ],    [ 'q', 3 ],           [ 'TU', 1 ],
  [ 'qGcQqIVdFr', 1 ]
]

问题是“ubIEXAO”应该排在“YMQDBkOWy”之前。当您执行隔离的 -a.compareLocale(b) 时,它可以正常工作,并且在其他测试用例中,这部分代码可以正确对其他字符串进行排序。但在这个测试用例中则不然。我缺少什么?谢谢!

(我知道有无数其他方法可以解决这个问题,我只是想知道为什么这个排序函数没有按照该对象的预期工作)

javascript arrays string sorting compare
1个回答
0
投票

您可以直接使用比较运算符使其区分大小写。

items.sort((a, b) => b[1] - a[1] || (b > a) - (b < a));
© www.soinside.com 2019 - 2024. All rights reserved.