字符串和数字组合的数组排序功能

时间:2019-04-16 16:56:11

标签: javascript

我需要对值数组进行排序

const array = [1, 2, 3, 'N/A', 4,'N/A', 5, 'N/A','N/A'];

我得到如下输出。

[1, 2, 3, 'N/A', 4,'N/A', 5, 'N/A','N/A'];

我希望像下面这样

[1, 2, 3, 4, 5, "N/A", "N/A", "N/A", "N/A"]

我的排序功能是

const sortFunction = (a, b) => {
  if (a === b) {
    return 0;
  }
  return a < b ? -1 : 1;
};

4 个答案:

答案 0 :(得分:1)

检查号码是否正确,并相应地使用Array#sort方法进行排序。

const array = [1, 2, 3, 'N/A', 4, 'N/A', 5, 'N/A', 'N/A'];


// check value is number or not, if not number then return Infinity(largest num as possible)
const getSortVal = v => isNaN(v) ? Infinity : v;

// check the difference for sorting
array.sort((a, b) => getSortVal(a) - getSortVal(b))

console.log(array)


如果有可能使用其他字符串,并且您也希望按字母顺序对它们进行排序,请使用String#localeCompare方法进行字符串比较。

const array = [1, 'xxx', 2, 3, 'N/A', 4, 'N/A', 5, 'N/A', 'N/A', 'dsds', 'aa', 'zzz'];


// check value is number or not, if not number then return Infinity(largest num as possible)
const getSortVal = v => isNaN(v) ? Infinity : v;


// check both are strings then use localeCompare for string comparison 
// or use number difference as previously
array.sort((a, b) => isNaN(a) && isNaN(b) ? a.localeCompare(b) : getSortVal(a) - getSortVal(b))


console.log(array)

答案 1 :(得分:1)

与任何“多部分”问题一样,正确的解决方案是分解问题。

在这种情况下,您要先对数字进行排序,然后对字符串进行排序,最后将它们连接在一起。

const numbers = array.filter(x=>typeof x === 'number');
const strings = array.filter(x=>typeof x === 'string');

numbers.sort((a,b)=>a-b); // sort numerically
strings.sort(); // sort as strings (optional I guess in your case?)

return [...numbers, ...strings];

答案 2 :(得分:1)

您可以先按NaN排序,然后按值排序。

var array = [1, 2, 3, 'N/A', 4,'N/A', 5, 'N/A','N/A'];

array.sort((a, b) => isNaN(a) - isNaN(b) || a - b);

console.log(array)

答案 3 :(得分:1)

一种略有不同的方法:

const array = [1, 2, 3, 'N/A', 4,'N/A', 5, 'N/A','N/A'];

const sortFunction = (a, b) => +a !== a || a - b;

console.log(...array.sort(sortFunction));

工作原理:+aa转换为数字,因此,如果+a !== a || a - b不是A,则true返回a数字,否则返回ab之间的差。