近日在工作中遇到了一个挺有意思的问题。对JS的对象按Key值排序。如下面的obj对象
var obj ={
"中国(100)":"‘beijing‘,‘sichuan‘ ,‘jilin‘",
"英国大不列颠(2)" :"‘london‘,‘airland‘",
"美国加州(5)":"‘phonix‘,‘atalata‘",
"德意志(4)":"‘berlin‘,‘etc‘"
}
最初遇到这个问题,我是想通过一个遍历拿到所有的Key值,push到一个数组,然后对数组进行一个arr.sort()排序。
但是我不能直接对 ’中国100‘,’德意志4‘,排序因为ASCII码还是什么的应该是不支持中文的,(具体是什么原因,以后再深究)。
所以我需要拿到中文结束后的数值,然后对数值进行排序。
这里我就掉进了一个坑。我单独取出了中文和数字,然后我想对数字排序后再重新拼接回去,最后再通过排好序的key遍历得到对应的值,然后属性应该就算排序好了~
聪明的你估计已经想到了这个坑是什么,就是我这样做压根对这个问题没有任何帮助。
如果我有多个key值的后边跟的数值是一样的(如’意大利1‘,’西班牙1‘)我把这个数值取出来有什么意义呢?
难道我还能通过这个数值去找到前边的中文字符?亦或者 总之,这应该是我某些方面的问题...
随后,我想到了改写js定义好的sort()方法:
我们知道使用sort()方法,最简便的格式返回一个升序或者降序序列(根据数值大小)是这样:
sort(function(a,b){return a-b/b-a})//a-b为升序,b-a为降序。
但是此时我又在纠结这个中文字符的问题。。
可能基础知识不扎实,或者说经验不够。我没有想到说使用substring取出数值,对数值排序。
像这样: //var reg = /[\u4e00-\u9fa5]*/;
sort(function(a,b){
a = a.substring(a.indexOf("("),a.indexOf(")"));b=... return b-a;
})
这样sort()出来的数组应该就是arr=[‘英国大不列颠2‘,‘德意志4‘,‘美国加州5‘,‘中国100‘];
然后通过嵌套的for循环,
for(var i=0;i<arr.length;i++){
for( i in obj){
if(arr[i]==i) arr2.push(‘...‘)
}
}
就能迭代输出有序的对象属性。
(我们知道遍历对象中的属性,通常我们会使用for in来循环遍历属性,然后就可以拿到每一对应的值。但是for in的结果本身是无序的)--
这期间取出key值中的中文字符,还去看了一些正则表达式的东西。以前有接触过正则,但是可能我连text,match,replace这些有什么区别都不是很清楚。
而且我不知道这些方法放回的值(数组)都是什么含义。 例如 str.match(reg)[0] 这样才能拿到你想要的文本,因为match方法返回的是一个数组,
数组的第一个原始是匹配到的文本。(1)
这个问题本身还是很简单的,但是为什么我还是折腾了很久才出来~~~:
1.思考问题的深度和方式有待加强 2.基础知识的掌握程度不够 3.智商不够。还不勤奋一点。
最后:复杂的问题都是由一个个简单的问题组成的。我们缺少的是量的积累,不要总想着质的改变。