字符串排序数组,数字最后排序

时间:2019-07-02 11:20:36

标签: javascript arrays sorting

我需要对数组进行排序。我想在alfa之后看到字符串的开头/包含数字。

为:

['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 个答案:

答案 0 :(得分:3)

  

我必须遍历整个字符串吗?

如果只是将其作为字符串中的第一个字符(如您看来,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);

答案 1 :(得分:0)

<!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>

希望获得帮助