我试图通过降序排序并以数字开头排序对象数组,这是我所拥有的:
var users = [
{ 'user': 'fred', 'a': 48 },
{ 'user': 'barney', 'a': 'b' },
{ 'user': 'fred', 'a': 40 },
{ 'user': 'barney', 'a': 'c' }
];
_.orderBy(users, 'a', 'desc');
结果:
0: Object {a: "b", user: "barney"}
1: Object {a: "c", user: "barney"}
2: Object {a: 48, user: "fred"}
3: Object {a: 40, user: "fred"}
预期结果:
0: Object {a: 48, user: "fred"}
1: Object {a: 40, user: "fred"}
2: Object {a: "b", user: "barney"}
3: Object {a: "c", user: "barney"}
答案 0 :(得分:1)
您可以先对类型应用检查,然后返回布尔值的增量。
如果不相等,请检查类型并返回字符串比较结果(升序)或数值增量(降序)。
var users = [{ 'user': 'fred', 'a': 48 }, { 'user': 'barney', 'a': 'b' }, { 'user': 'fred', 'a': 40 }, { 'user': 'fred', 'a': 0 }, { 'user': 'fred', 'a': 0 }, { 'user': 'barney', 'a': 'a' }, { 'user': 'barney', 'a': 'd' }, { 'user': 'fred', 'a': 0 }, { 'user': 'barney', 'a': 'c' }, { 'user': 'fred', 'a': 47 }, { 'user': 'fred', 'a': 46 }];
users.sort(({ a: a }, { a: b }) =>
(typeof a === 'string') - (typeof b === 'string') ||
(typeof a === 'string' ? a.localeCompare(b) : b - a));
console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
您可以提供多个排序键(“iteratees”)和每个键的顺序
_.orderBy(users, [x => isNaN(x.a), 'a'], ['asc', 'desc']);
但是,这也将对字符串进行降序排序(即结果为48, 40, c, b
。
var users = [
{ 'user': 'x', 'a': 'a' },
{ 'user': 'x', 'a': 948 },
{ 'user': 'x', 'a': 48 },
{ 'user': 'x', 'a': -480 },
{ 'user': 'x', 'a': 'c' },
{ 'user': 'x', 'a': 548 },
{ 'user': 'x', 'a': 4558 },
{ 'user': 'x', 'a': 148 },
{ 'user': 'x', 'a': 4834534 },
{ 'user': 'x', 'a': 1 },
{ 'user': 'x', 'a': 'b' },
];
users = _.orderBy(users, [x => isNaN(x.a), 'a'], ['asc', 'desc']);
console.log(users)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>
答案 2 :(得分:0)
如果要比较的两个元素是字母,请通过字符串比较进行检查。如果其中一个是一封信,那就把它放在第二个之后。如果两个是数字,只需做一个简单的检查。
var users = [
{ 'user': 'fred', 'a': 48 },
{ 'user': 'barney', 'a': 'b' },
{ 'user': 'fred', 'a': 40 },
{ 'user': 'barney', 'a': 'c' }
];
users.sort((obj1, obj2) => {
if(typeof obj1.a ==='string' && typeof obj2.a ==='string' ) {
return obj1.a.localeCompare(obj2.a);
}
if(typeof obj1.a ==='string') {
return 1;
}
return obj1.a - obj2.a;
});
console.log(users);
在您的预期结果中,您的数字按降序排列。为此,您只需将obj1.a - obj2.a
替换为obj2.a - obj1.a
。
答案 3 :(得分:0)
检查类型以查看它们是否匹配。如果是,则根据类型进行排序。如果没有,则返回1
如果它们是字符串,则返回-1
。这将把字符串发送到最后。
var users = [
{ 'user': 'fred', 'a': 48 },
{ 'user': 'barney', 'a': 'b' },
{ 'user': 'fred', 'a': 40 },
{ 'user': 'barney', 'a': 'c' }
];
users.sort((a, b) => {
const aTyp = typeof a.a;
const isStr = aTyp == "string";
if (aTyp == typeof b.a) {
return isStr ? a.a.localeCompare(b.a) : b.a - a.a;
}
return isStr ? 1 : -1;
});
console.log(users);