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)
请帮忙.
使用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)
_.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)