JS更好的字符串排序(字母顺序+数字大小排序)

9 篇文章 0 订阅
8 篇文章 0 订阅

接之前写的java版

实现效果

在这里插入图片描述

2022.10.30 【修复之前整数掺杂小数的情况】调整适配 1.2.3.4栋 1.2.3.5栋情况,最新效果如下

在这里插入图片描述

简介

用原生的字符串比较是按照ASCII的顺序进行比较,结果并不如意,这里重写字符串比较,实现更为人性化的排序。

代码如下

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>更好的字符串排序</title>
</head>
<body>
	<script type="text/javascript">
		let arr = ["5.2.4栋","涉外国际7栋", "B1栋","5栋","B17栋", "5.2.2.4栋", "7栋", "4栋", "5.2.2.4栋", "15栋", "24栋",  "涉外国际6栋", "B666栋",  "A45栋", "A22栋", "5.2栋"];
		console.log('排序前:',arr);
		arr.sort((str1,str2)=>{
			return strCompare(str1,str2)
		});
		console.log('排序后',arr)
		/**
		 * 比较字符串
		 * @param str1 
		 * @param str2
		 */
		 function strCompare(str1,str2){
			// 处理数据为null的情况
			if (str1 == undefined && str2 == undefined) {
				return 0;
			}
			if (str1 == undefined) {
				return -1;
			}
			if (str2 == undefined) {
				return 1;
			}
		     // 比较字符串中的每个字符
		     let c1;
		     let c2;
		     // 逐字比较返回结果
		     for (let i = 0; i < str1.length; i++) {
		     	c1 = str1[i];
	         	 if (i > str2.length - 1) {// 如果在该字符前,两个串都一样,str2更短,则str1较大
	         	 	return 1;
	         	 }
	         	 c2 = str2[i];
		         // 如果都是数字的话,则需要考虑多位数的情况,取出完整的数字字符串,转化为数字再进行比较
		         if (isNumber(c1) && isNumber(c2)) {
		         	let numStr1 = "";
		         	let numStr2 = "";
		             // 获取数字部分字符串
		             for (let j = i; j < str1.length; j++) {
		             	c1 = str1[j];
		                 if (!isNumber(c1) && c1!=='.') { // 不是数字则直接退出循环
		                 	break;
		                 }
		                 numStr1 += c1;
		             }
		             for (let j = i; j < str2.length; j++) {
		             	c2 = str2[j];
		             	if (!isNumber(c2) && c2!=='.') {
		             		break;
		             	}
		             	numStr2 += c2;
		             }
		             // 将带小数点的数字转换为数字字符串数组
		             let numberArray1 = numberStrToNumberArray(numStr1);
		             let numberArray2 = numberStrToNumberArray(numStr2);
		             return compareNumberArray(numberArray1, numberArray2);
		         }

		         // 不是数字的比较方式
		         if (c1 != c2) {
		         	return c1 > c2?1:-1;
		         }
		     }
		     return 0;
		 }

		/**
		 * 判断是否为数字
		 * @param obj 
		 * @returns 
		 */
		 function isNumber(obj) {
		 	if (parseFloat(obj).toString() == "NaN") {
		 		return false;
		 	}
		 	return true;
		 }

		 /**
		 * 数字字符串转数字数组
		 * 适配 1.25.3.5 这种情况 ,同时如果不不包含小数点【整数情况】
		 *
		 * @return
		 */
		function numberStrToNumberArray(numberStr) {
			// 按小数点分割字符串数组
			let numberArray = numberStr.split("\.");
			// 长度为0说明没有小数点,则整个字符串作为第一个元素
			if (numberArray.length == 0) {
				numberArray[0] = numberStr;
			}
			return numberArray;

		}

	     /**
         * 比较两个数字数组
         *
         * @param numberArray1
         * @param numberArray2
         */
         function compareNumberArray(numberArray1, numberArray2) {
         	for (let i = 0; i < numberArray1.length; i++) {
                if (numberArray2.length < i + 1) { // 此时数字数组2比1短,直接返回
                	return 1;
                }
                let compareResult = parseInt(numberArray1[i]) - parseInt(numberArray2[i]);
                if (compareResult != 0) {
                	return compareResult;
                }
            }
            // 说明数组1比数组2短,返回小于
            return -1;
        }
    </script>
</body>
</html>

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 字符串字母排序可以通过以下步骤实现: 1. 首先,将字符串转换为一个数组,并使用字符串的 `split()` 方法,使用空格作为分隔符将字符串拆分为多个单词。 2. 接下来,使用数组的 `map()` 方法将每个单词的首字母提取出来并转换为大写字母,使用字符串的 `charAt()` 方法获取首字母,并通过 `toUpperCase()` 方法将其转换为大写。 3. 使用数组的 `sort()` 方法对首字母数组进行排序。默认情况下,对字符串进行排序时,会按照字母的 Unicode 编码进行排序。 4. 最后,再次使用数组的 `map()` 方法将排序后的首字母数组转换为字符串。首字母数组中的每个元素都是字符串的一个字符,因此可以使用数组的 `join()` 方法将这些字符连接起来。使用空格作为连接符将字符拼接成一个字符串。 以下是一个简单的 JavaScript 代码示例: ```javascript let str = "javascript 字符串字母排序"; let sortedStr = str.split(' ') // 将字符串分割成单词数组 .map(word => word.charAt(0).toUpperCase()) // 提取每个单词的首字母并转换为大写 .sort() // 对首字母数组进行排序 .map(letter => letter.toLowerCase()) // 转换排序后的首字母为小写 .join(' '); // 将排序后的首字母拼接成字符串,使用空格作为连接符 console.log(sortedStr); // 输出: "z j s" ``` 以上代码会将原始字符串中的每个单词的首字母提取出来并进行排序,最后返回一个字符串,其中每个字母都是排序后首字母的小写形式,并按照排序顺序排列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值