Сортировка массива строк, но последние числа - PullRequest
1 голос
/ 02 июля 2019

мне нужно отсортировать мой массив.Я хотел бы видеть строку, начинающуюся / содержащую числа после альфа.

Как:

['ip', 'email', '0email', 'em0ail' ,1001, '23name', 'name', 'address']

должно быть:

['address', 'email', 'em0ail', 'ip', 'name', '0email', 1001, '23name']

То есть 0 должно быть после z

columns.sort((a, b) => {
      const x = a.toString();
      const y = b.toString();
      if (x < y) {
        return -1;
      }
      if (x > y) {
        return 1;
      }
      return 0;
    });

сначала возвращает числа

Как мне подходить к этому случаю?Должен ли я перебирать всю строку?

Ответы [ 2 ]

3 голосов
/ 02 июля 2019

Должен ли я перебирать всю строку?

Нет, если вы просто основываете это на первом символе в строке (как вам кажется, с em0ailотсортировано по строкам).Просто проверьте, начинаются ли строки с цифры или не цифры, и в тех случаях, когда у одной есть цифра, а у другой - нет, верните соответствующие 1 или -1, чтобы поставить первую цифру без цифры;в случаях, когда они оба начинают или не начинают с цифры, возвращают результат localeCompare.

(для числа, которое мы можем просто преобразовать в строку.)

const columns = ['ip', 'email', '0email', 'em0ail' ,1001, '23name', 'name', 'address'];

function startsWithDigit(v) {
    const ch = v[0];
    return ch >= "0" && ch <= "9";
}

columns.sort((a, b) => {
    a = String(a);
    b = String(b);
    adigit = startsWithDigit(a);
    bdigit = startsWithDigit(b);
    if (adigit == bdigit) {
        return a.localeCompare(b);
    } else if (adigit) {
        return 1;
    } else {
        return -1;
    }
});

console.log(columns);
0 голосов
/ 02 июля 2019

<!DOCTYPE html>
<html>
<head>

</head>

<body>


<script>
var columns=['ip', 'email', '0email', 'em0ail' ,1001, '23name', 'name', 'address'];
function Turn(CharZ){
	//Make 0~9 biger then a-z and A-Z
	if(CharZ<'9'.charCodeAt()){
		return CharZ+'Z'.charCodeAt();
	}
	return CharZ;
}
columns.sort((a, b) => {
	var x = a.toString();
	var y = b.toString();
	var Lx=x.length;
	var Ly=y.length;
	var MinL=Math.min(Lx, Ly);
	for (var i = 0; i < MinL; i++) {
		if(Turn(x.charCodeAt(i))-Turn(y.charCodeAt(i))>0){
			return 1;
		}else if(Turn(x.charCodeAt(i))-Turn(y.charCodeAt(i))<0){
			return -1;
		}
		
		
	}
	//if front all equals  but length not same mean there is remain
	if (Lx > Ly) {
		return 1;
	}
	if (Lx < Ly) {
		return -1;
	}
	return 0;
});
document.body.innerHTML = columns;

</script>

</body>
</html>

Надеюсь, что эта помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...