2012-05-22 99 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