2012-05-22 47 views
1

我想有點像這樣的列表:jQuery的inArray()總是返回-1

<ul> 
    <li>L</li> 
    <li>S</li> 
    <li>XXS</li> 
    <li>XS</li> 
    <li>XL</li> 
    <li>L</li> 
</ul> 

使用JavaScript和jQuery拿到衣服尺碼的正確順序 我的嘗試是這樣的:

var mylist = jQuery('#filter-size .mana-list'); 
var listitems = mylist.children('li').get(); 
listitems.sort(function (a, b) { 

    var sizes = new Array(); 
    sizes = ["XXXS", "XXS", "XS", "S", "S-M", "S-L", "M", "M-L", "L", "L-XL", "XL", "XXL", "XXXL"]; 

    var compA = jQuery(a).text().toUpperCase(); 
    var compB = jQuery(b).text().toUpperCase(); 

    var asize = jQuery.inArray(compA, sizes); 
    var bsize = jQuery.inArray(compB, sizes); 

    return (asize > bsize) ? -1 : (asize < bsize) ? 1 : 0; 
}) 

我的問題是,inArray()函數總是返回-1 我做錯了什麼?

(注:我在usign jQuery的 「沒有衝突」 模式)

謝謝大家提前

+1

你可以發佈'console.log(compA)'和'console.log(asize)' – ilanco

+0

'inArray'的輸出並不總是爲我返回'-1' ..什麼版本的jQuery? http://jsfiddle.net/jNnTG/ –

+0

它不是-1 ...看到這裏:http://jsfiddle.net/qjxpX/ –

回答

3

你的代碼出現不必要的複雜。

這也將產生項目的排序列表,並避免昂貴的DOM(和jQuery)調用被比較函數中使用:

// get all of the text items, in order, in upper case 
var listitems = jQuery('ul').children('li').map(function() { 
    return jQuery(this).text().toUpperCase(); 
}).get(); 

// keep this outside the function to avoid instantiating it 
// every time the comparator is called 
var sizes = ["XXXS", "XXS", "XS", "S", "S-M", "S-L", "M", 
       "M-L", "L", "L-XL", "XL", "XXL", "XXXL"]; 

// just compare the "inArray" values to sort  
listitems.sort(function(a, b) { 
    return jQuery.inArray(b, sizes) - jQuery.inArray(a, sizes); 
}) 

注意,在比較器功能使用簡單的負操作的 - 這個從大到小排序,比較器只需要產生「負,零,正」,而不是「-1,0,1」。

注意:這不會更改頁面中的元素 - 請澄清,如果這是您的意圖。

http://jsfiddle.net/alnitak/v3hqB/

+0

謝謝!我使用這段代碼來改變頁面中的列表項jQuery.each(listitems,function(idx,itm){mylist.append(itm);}); – kask

0

後隨到參宿出色答卷。

你的排序很好。如果你想更新顯示,像下面這樣(迅速寫的)就可以了:

var newList = $('<ul></ul>'); 
newList.append(listitems); 
mylist.replaceWith(newList); 

(有可能是一個更好的辦法或許....可能newListlistitems一次性構建)

+0

謝謝!我用:jQuery.each(listitems,function(idx,itm){mylist.append(itm);}); – kask