Lodash:排序对象数组,首先排列字母,然后是数字

use*_*866 7 javascript arrays sorting string lodash

我有一个对象数组,让我们说:

var objects = [
  {name: 'A'},
  {name: '1'},
  {name: 'B'}
]
Run Code Online (Sandbox Code Playgroud)

知道我可以使用Lodash sortBy对其进行排序:

objects= _.sortBy(objects, 'name')
Run Code Online (Sandbox Code Playgroud)

这将导致:

[
  {name: '1'},
  {name: 'A'},
  {name: 'B'}
]
Run Code Online (Sandbox Code Playgroud)

但我想要的输出是这样的:

[
  {name: 'A'},
  {name: 'B'},
  {name: '1'}
]
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Ori*_*ori 6

使用Array#sort你可以应用这个逻辑:

// If both are numbers or both are not numbers
isNaN(a.name) === isNaN(b.name) ?
     // then compare between them 
    a.name.localeCompare(b.name)
    : // else
    // If the 1st is not a number move it up, if it's a number move it down
    (isNaN(a.name) ? -1 : 1); 
Run Code Online (Sandbox Code Playgroud)

没有lodash:

var objects = [{"name":"A"},{"name":"3"},{"name":"1"},{"name":"B"}];

objects.sort(function(a, b) {
  return isNaN(a.name) === isNaN(b.name) ? a.name.localeCompare(b.name) : (isNaN(a.name) ? -1 : 1);
});

console.log(objects);
Run Code Online (Sandbox Code Playgroud)

作为lodash链条的一部分:

var objects = [{"name":"A"},{"name":"3"},{"name":"1"},{"name":"B"}];

var result = _(objects)
  .sort(function(a, b) {
    return isNaN(a.name) === isNaN(b.name) ? a.name.localeCompare(b.name) : (isNaN(a.name) ? -1 : 1);
  }) 
  .value();

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.3/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


GG.*_*GG. 1

解决方案有两个_.sortBy()

一个首先用于优先考虑字母,然后另一个用于对元素进行排序。

在我看来,它更具可读性,并且不会对性能产生影响。

const objects = [
  {name: 'B'},
  {name: '2'},
  {name: '1'},
  {name: 'A'}
]

const result = _.sortBy(_.sortBy(objects, o => !isNaN(parseInt(o.name)), 'name'))

console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://lodash.com/vendor/cdn.jsdelivr.net/lodash/4.17.3/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)