我需要对一组值进行排序
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;
};
与任何“多部分”问题一样,正确的解决方案是解决问题。
在这种情况下,您希望首先对数字进行排序,然后对字符串进行排序,最后将它们连接在一起。
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];
您可以先按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)
检查号码与否,并相应地使用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)
略有不同的方法:
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
不是数字,true
会返回a
,否则它会返回a
和b
之间的差异。