首页 > 解决方案 > javascript中的自定义排序

问题描述

我正在尝试实现自定义sort功能。我有这些规则:

['B', 'A'] => will become ['A', 'B']

['2', '1'] => will become ['1', '2']

['Down', 'Up'] => will become ['Up', 'Down']

因此,如果有数字或字符串,我想按升序对它们进行排序,但如果我有关键字Up/Down,我想Up先,然后Down

这是我迄今为止尝试过的:

let c = [
  {
    pos: 'Down',
  },
  {
    pos: 'Up',
  },
];

c.sort(function (a, b) {
  console.log(a.pos) // why is this 'Up' and not 'Down'?
  if (a.pos === 'Down' && b.pos === 'Up') {
    console.log('enter on 1');
    return 1;
  } else {
    if (a.pos > b.pos) {
      console.log('enter on 2');
      return 1;
    }
  }
  console.log('enter on 3');
  return -1;
});

console.log(c); // expected result [{pos: 'Up'}, {'pos': 'Down'}]

我期待我的代码,enter on 1但它进入了enter on 2。那么为什么console.log(a.pos)我得到Up而不是Down呢?

感谢您的时间!

标签: javascriptsorting

解决方案


function mySort(arr) {
  arr.sort(function (a, b) {
    a = a.pos;
    b = b.pos;
    if (a==='up' && b==='down')
        return -1;
    if (b==='up' && a==='down')
        return 1;
    if (!(isNaN(a)))
        return a-b;
    return a.localeCompare(b);
  });
  return arr;
}

console.log(mySort([{pos:'Down'}, {pos:'Up'}]));
console.log(mySort([{pos:'B'},{pos:'X'},{pos:'A'}]));
console.log(mySort([{pos:12},{pos:56},{pos:2},{pos:0}]));


推荐阅读