近日在工作中遇到了一個挺有意思的問題。對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.智商不夠。還不勤奮一點。
最后:復雜的問題都是由一個個簡單的問題組成的。我們缺少的是量的積累,不要總想着質的改變。