通过' desc'对对象数组进行排序首先是数字

时间:2018-03-14 20:44:04

标签: javascript sorting lodash

我试图通过降序排序并以数字开头排序对象数组,这是我所拥有的:

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"}

4 个答案:

答案 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);