首页 > 解决方案 > Lodash 使用 Alphanumberic 排序不正确?

问题描述

我正在使用 lodash 对数组进行排序。

前任:

    const arr = [ { name: 'Card 2' }, { name: 'Card 1' }, { name: 'Card 10' }]

种类:

    lodash.orderBy(arr, ['name'], ['asc'])

结果:

    [{ name: 'Card 1' }, { name: 'Card 10' }, { name: 'Card 2' }]

我该如何解决?我期望结果应该是:

   [ { name: 'Card 1' }, { name: 'Card 2' }, { name: 'Card 10' }]

标签: lodash

解决方案


它是正确的。您正在按字典顺序排序。就像“土豚”在“a”之后和“b”之前一样,“10”也在“1”之后但在“2”之前。如果要按数字对其进行排序,则需要提取数字。

在这里,我将每个数组分成字母和数字部分,然后用零填充数字部分,以便可以像字符串一样比较它们(例如"Card 0000000000000010"):

const arr = [ { name: 'Card 2' }, { name: 'Card 1' }, { name: 'Card 10' }, { name: 'Document 1' }]
const sortedArr = _.sortBy(arr, [function(o) {
  const split = o.name.split(/\b(\d+)\b/);
  for (let i = 1; i < split.length; i += 2) {
    split[i] = split[i].padStart(16, '0');
  }
  return split.join('');
}]);
console.log(sortedArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


推荐阅读