Javascript:排序一个字符串数字数组

Rye*_*Guy 2 javascript arrays

我有一系列学校成绩,如下所示

(注意'N'代表没有等级,'K'代表幼儿园)

const toSort = ['1','3','4','5','6','7','9','10','11','12','K','2 ", 'N', '8'];

使用javascript sort()方法我想安排数组,使它看起来像

const sorted = ['K','1','2','3','4','5','6','7','8','9','10','11 ",'12' , 'N'].

这是我的尝试:

const toSort = ['1', '3', '4', '5', '6', '7', '9', '10', '11', '12', 'K', '2', 'N', '8'];

toSort.sort();
// Produces: ["1", "10", "11", "12", "2", "3", "4", "5", "6", "7", "8", "9", "K", "N"]

const test = toSort.sort((a, b) => {
  if (a === 'K') {
    return -1;
  }

  return Number(a) < Number(b) ? -1 : Number(a) > Number(b) ? 1 : 0;
});

console.log(test)
Run Code Online (Sandbox Code Playgroud)

https://jsbin.com/pocajayala/1/edit?html,js,console,output

知道如何解决这个问题吗?

Liv*_*viu 19

您可以使用字符串的本机原型localeCompare()函数,如下所示:

['1', '3', '4', '5', '6', '7', '9', '10', '11', '12', 'K', '2', 'N', '8']
    .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))

//  ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "K", "N"]
Run Code Online (Sandbox Code Playgroud)

它也适用于其他字符中的数字。


pon*_*tek 6

const toSort = ['1', '3', '4', '5', '6', '7', '9', '10', '11', '12', 'K', '2', 'N', '8'];

const test = toSort.sort((a, b) => {
	// console.log('a ' + a + ' b ' + b);
	if (a === "K" || b === "N") {
		return -1;
	}
	if (a === "N" || b === "K") {
		return 1;
	}
	return +a - +b;
});

console.log(test)
Run Code Online (Sandbox Code Playgroud)


Ara*_*Rey 6

我会这样做:

const toSort = ['1', '3', '4', '5', '6', '7', '9', '10', '11', '12', 'K', '2', 'N', '8'];

const transform = k => {
    if (k === 'K') return 0;
    else if (k === 'N') return 13;
    else return +k;
}

const test = toSort.sort((a, b) => transform(a) - transform(b));

console.log(test);
Run Code Online (Sandbox Code Playgroud)

如果你的字母与那些特定的数字没有相关性,而是总是最大和最小,你可以使用Infinity-Infinitytransform函数上.

const transform = k => {
    if (k === 'K') return -Infinity;
    else if (k === 'N') return Infinity;
    else return +k;
}
Run Code Online (Sandbox Code Playgroud)