2016-07-27 82 views
0

我有一個對象數組。如何通過字符串值對數組中的對象數組進行排序?

在每個對象中,我定位了一個名爲「myLevel」的屬性。此屬性的值以下字符串語法有所不同:

[ 
{myLevel : 'CAT I #4'}, 
{myLevel : 'CAT I #6'}, 
{myLevel : 'CAT I #2'}, 
{myLevel : 'CAT II #15'}, 
{myLevel : 'CAT III #1'}, 
{myLevel : 'CAT II #7'}, 

    ] 

我如何排序的數組,這樣的對象以升序重新排列,像這樣:

[ 
{myLevel : 'CAT I #2'}, 
{myLevel : 'CAT I #4'}, 
{myLevel : 'CAT I #6'}, 
{myLevel : 'CAT II #7'}, 
{myLevel : 'CAT II #15'}, 
{myLevel : 'CAT III #1'} 
    ] 
+0

類似的問題這已經問:http://stackoverflow.com/questions/1129216/sort-array-of-objects-by-string-property-value-in-javascript –

+0

能否羅馬數字的CAT值高於'III'?如果你需要讓'VIII'小於'IX'等,這會使事情變得複雜。 – nnnnnn

+0

nope,它被限制在III,這將是痛苦的 –

回答

1

使用正則表達式匹配的部分,然後檢查個別

var arr = [ 
{myLevel : "CAT I #4"}, 
{myLevel : "CAT I #6"}, 
{myLevel : "CAT I #2"}, 
{myLevel : "CAT II #15"}, 
{myLevel : "CAT III #1"}, 
{myLevel : "CAT II #7"} 
]; 

var sorted = arr.sort(function(a,b){ 
var left = a.myLevel.match(/CAT (I+) #([0-9]+)/); 
var right = b.myLevel.match(/CAT (I+) #([0-9]+)/); 
if(left[1].length==right[1].length){ 
    return left[2]-right[2]; 
}else return left[1].length-right[1].length; 
}); 

那些部分的match回報

[0] whole matched string 
[1] all the `I`'s 
[2] the number after the # 

第一if是檢查I數是一樣的,如果是我們需要檢查數字。

如果我們需要檢查數字,我們只需要返回它們之間的差異。

如果我們不需要通過我們只需要一個比較I

+0

感謝Issac,我是RegEx的新手,閱讀了一些簡要文檔。我得到了你所做的匹配調用,但你能解釋if/else語句嗎?這部分很難理解! –

+0

@ Kode_12我更新了if語句並添加了解釋 – Isaac

1

請使用Array.sort和在傳遞的函數中,用#符號分割字符串,將前半部分作爲字符串進行比較,如果偶數,則將後半部分作爲int與call parseInt進行比較。
實際上,如果有很多記錄,這會很慢。你應該真的把這些記錄存儲爲一個具有2個整數的對象和級別的對象。 Thia將使分揀效率更高。您可以覆蓋toString函數以您喜歡的方式顯示它。

+0

正如其他評論中提到的那樣,只有羅馬數字不會太高,前半部分的字符串比較纔會起作用,即他們沒有達到他們到達XL(40)。 – lionscribe

0

使用sort量之間返回的差異數量進行檢查。

// assume we want to have arbitrary roman numerals - we should have some form of lookup 
var numeralLookup = { 
    I: 1, 
    II: 2, 
    III: 3, 
    IV: 4 
} //etc 

// helper function - parse Roman Numeral from your string 
function getNumeral(str) { 
    return str.split()[1] 
} 

// helper function - parse number after '#' from your string 
function getNumber(str) { 
    return parseInt(str.slice(str.indexOf('#') + 1)) 
} 

// sort 
arr.sort(function(a, b) { 
    var aNum = numeralLookup[getNumeral(a.myLevel)]; 
    var bNum = numeralLookup[getNumeral(b.myLevel)]; 

    return aNum === bNum ? getNumber(a.myLevel) - getNumber(b.myLevel) : aNum - bNum; 
}) 
+0

您還需要在排序條件中包含「CAT x」部分。 – nnnnnn

+0

@nnnnnn好點完全錯過了:) – Damon

0

相信不是Array.sort的更快替代方案是Underscore的sortBy函數。檢查出their documentation here。圖書館有各種各樣的偉大的工具來完成這樣的事情。

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}]; 
_.sortBy(stooges, 'name'); 
=> [{name: 'curly', age: 60}, {name: 'larry', age: 50}, {name: 'moe', age: 40}]; 
+0

這並沒有回答這個問題。 OP並不擔心速度,因爲他們不知道如何實現正確的排序順序。 – nnnnnn

+0

這絕對回答了他的問題。他沒有問如何從頭開始。他問如何去做。這是做到這一點的一種方法。 :) –

+0

這不是一個普通的字符串排序,或一個普通的數字排序。 OP的值包括具有兩個不同數字(一個用羅馬數字表示)的字符串和數字數據*在同一個屬性*中。你的答案甚至沒有提到這一點。所以不,它不回答這個問題。 – nnnnnn

相關問題