javascript 数组按名称的字母顺序排序

1. 出现场景: 支付系统需要生成签名加密,有一次我接了一个接口,需要前端的同事传递一个sign参数(表单值按顺序拼接,并拼上私钥值进行md5运算)

问题: js 不像java 有map.list 等集合框架,也没有很现成的排序方法,

        js 也不像java 提供jca 等加密框架,对各种加密算法进行支持

解决: 1. 于是就干脆手写了一个javascript 的排序方法,

         2.在网上找到一个牛人写的javascript 的 md5.js (此页面还包含其他加密算法的javascript实现)

自定义手写的javascript 的排序js , sortArrString.js

主方法为getKeySort(传入的数组)对象,返回拍过序的数组对象,

内部排序算法是通过: 冒泡排序

规则 :是按字母顺序升序进行排序,按参数名的第一个字母进行比较,如果相同则比较第二个,直到排出大小

js 的 == 可以比较字符串的大小

/**
 * 测试demo ,假设传入的情况
 *  是数组,返回数组按字母顺序升序
 *  @author kzcming
 *  
 * var signStr = {
	account:"97987985",
	username:"0004",
	pay_star_type:"pay_star_ggm",
	service_type:"gm_ibc",
	game_code  :"1",
}

 getKeySort(getObjectKey(signStr));*/

/**
 * 传入对象 ,排序返回对象的属性数组
 */
function getObjectKey(obj){
	return Object.keys(obj);
}

/**
 * 传入数组
 * 按字母顺序,升序
 * 冒泡排序
 */
function getKeySort(strArr){
	var count = 0;
	var compareInt = 0;
	for (var i = 0; i < strArr.length; i++) {
		for (var j = 0; j < strArr.length - 1 - i; j++) {
			/*if(strArr [j].substring(0,1) > strArr[j + 1].substring(0,1)){
				var temp = strArr[j + 1];
				strArr[j + 1] = strArr[j];
				strArr[j] = temp;
			}
			if(strArr [j].substring(0,1) == strArr[j + 1].substring(0,1)){
				if(strArr [j].substring(1,2) > strArr[j + 1].substring(1,2)){
					var temp = strArr[j + 1];
					strArr[j + 1] = strArr[j];
					strArr[j] = temp;
				}
			}*/
			compareToIndexValue(strArr,compareInt,j);
			count ++ ;
		}	
	}
	/*console.log("遍历次数:"+count);*/
	/*console.log(strArr);*/
	return strArr;
}

/**
 *  根据首字母 排序,如果首字母相同则根据第二个字母排序...直到排出大小
 */
function compareToIndexValue(arr,int,arrIndex){
	if(arr[arrIndex].substring(int,int+1) == arr[arrIndex + 1].substring(int,int+1)) compareToIndexValue(arr,int+1,arrIndex);//如果第一位相等,则继续比较第二个字符
	else if(arr[arrIndex].substring(int,int+1) > arr[arrIndex + 1].substring(int,int+1)) {
		var temp = arr[arrIndex + 1];
		arr[arrIndex + 1] = arr[arrIndex];
		arr[arrIndex] = temp
	}/*else if(arr[arrIndex].substring(int,int+1) < arr[arrIndex + 1].substring(int,int+1)) return;*/
	return;
}

/**
 * 输入排序过后的key=value 值数组,用  "&" 字符拼接为字符串
 */
function getKeyValueSortStr(strArr){
	var longStr = "";
	for (var str in strArr) {
		longStr += strArr[str] + "&";
	}
	return longStr.substring(0,longStr.length - 1);//移除最后一个 & 符号
}

我的调用过程

扫描二维码关注公众号,回复: 884731 查看本文章
//实现本地化签名,不需要 在另外一个jsp 页面计算签名
	function testMD2(){
		var formParam = $("#bankPay").serialize();//获得参数的 key = value & key2 = value2形式
		var paraArr = formParam.split("&");//获得key=value 形式值的数组
		for(var i = 0;i < paraArr.length; i ++){
			if(paraArr[i].indexOf("=") + 2 > paraArr[i].length){//移除value 为空的参数
				paraArr.splice(i, 1);
				i --;
			}
		}
		var sortParaArr = getKeySort(paraArr);
		
		var paraStr = getKeyValueSortStr(sortParaArr).replace(/\+/g," ").replace(/%3A/g,":");//得到字符串 , + 是特殊字符,需要转义符号 \
		console.log(paraStr);
		var sign = hex_md5(paraStr + priKey);
		$("#sign").val(sign);
	}
hex_md5 为md5.js 中的方法

猜你喜欢

转载自blog.csdn.net/kzcming/article/details/80337639