2014-07-06 102 views
0

所以我有一個HTML鏈接數組;根據輸出對HTML數組排序

[ 
    "<a href=\"...\" target=\"_blank\">foo</a>", 
    "<a href=\"...\" target=\"_blank\">apple</a>", 
    "<a href=\"...\" target=\"_blank\">cucumber</a>" 
] 

而且我希望它基於它的面向用戶的輸出(即a標籤的內容)進行排序;

[ 
    "<a href=\"...\" target=\"_blank\">apple</a>", 
    "<a href=\"...\" target=\"_blank\">cucumber</a>", 
    "<a href=\"...\" target=\"_blank\">foo</a>" 
] 

我想我不得不剝離HTML標籤,然後.sort(),但我不知道如何來調和,然後與原始數組。我該怎麼做呢?

+0

你使用jQuery或尋找vanilla Javascript解決方案嗎? – haim770

回答

5

您可以使用DOMParser解析HTML並獲取標籤的內容。

通過不使用正則表達式,只要選擇器匹配,標記就可以是任何東西,這通常就是你想要的正則表達式isn't really capable of parsing HTML

然後使用localeCompare比較字符串,這樣就避免了區分大小寫和特殊字符的問題,你將不得不與<>

arr.sort(function(a,b) { 
    var docA = new DOMParser().parseFromString(a, "text/html"); 
    var docB = new DOMParser().parseFromString(b, "text/html"); 
    var txtA = docA.querySelector('a').innerHTML; 
    var txtB = docB.querySelector('a').innerHTML; 

    return txtA.localeCompare(txtB); 
}); 

FIDDLE

3

你可以使用正則表達式和比較函數來輕鬆地做到這一點。

var arr = [ 
    "<a href=\"...\" target=\"_blank\">foo</a>", 
    "<a href=\"...\" target=\"_blank\">apple</a>", 
    "<a href=\"...\" target=\"_blank\">cucumber</a>" 
] 

function compFunc(a,b){ 
    return a.match(/>(.*)</)[1] > b.match(/>(.*)</)[1]; 
} 

console.log(arr.sort(compFunc)) 

fiddle

正則表達式會閉幕>和開盤後<(需要確保它們之間有什麼是不包含這些字符),並圍繞(.*)括號之間的任何內容匹配意味着它是一個捕獲組和從.match()返回的數組中將具有該捕獲組的內容(我們想要的字符串)作爲第二個元素。

+0

+1 - 發佈我的時候沒有看到您的答案!不會發布重複。 – techfoobar

+0

+1正則表達式解決方案 –

+0

這是比較好的 - />(.+?)

2

您傳遞sortfunction參數sort method

var arr = [ 
    "<a href=\"...\" target=\"_blank\">foo</a>", 
    "<a href=\"...\" target=\"_blank\">apple</a>", 
    "<a href=\"...\" target=\"_blank\">cucumber</a>" 
]; 

var sorted = arr.sort(function(a, b) { 
    a = strip(a); 
    b = strip(b) 
    return a.localCompare(b); 
} 

以下是操作方法你做的地帶:Strip HTML from Text JavaScript