字符串和数字组合的数组排序功能[关闭]

问题描述 投票:0回答:4

我需要对一组值进行排序

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;
};
javascript
4个回答
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];

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)

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
投票

略有不同的方法:

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不是数字,true会返回a,否则它会返回ab之间的差异。

© www.soinside.com 2019 - 2024. All rights reserved.