我需要对值数组进行排序
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;
};
答案 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));
工作原理::+a
将a
转换为数字,因此,如果+a !== a || a - b
不是A,则true
返回a
数字,否则返回a
和b
之间的差。