2010-08-25 75 views
4

我需要排序一些元素取決於它的屬性。舉一個例子:jQuery的排序元素與數組值

<div id="sort"> 
<div n="1"></div> 
<div n="2"></div> 
<div n="3"></div> 
<div n="4"></div> 
</div> 

而且array_num

{3, 2, 1, 4} 

僞代碼:

$('#sort').sort(array_num, 'n'); 

的結果將是:

<div id="sort"> 
<div n="3"></div> 
<div n="2"></div> 
<div n="1"></div> 
<div n="4"></div> 
</div> 
+0

是否有某種「邏輯」在該順序後面,或者您需要它嗎? – jAndy 2010-08-25 06:37:37

+0

'n'不是有效的'html tag'屬性。它會在某些瀏覽器上引起一些不良行爲。 – Reigel 2010-08-25 06:38:13

+0

@jAndy:我想要的就是這樣:D @Reigel:jquery有expando屬性本身。 – StoneHeart 2010-08-25 06:38:36

回答

7
​var order = [3, 2, 4, 1]​; 
var el = $('#sort'); 
var map = {}; 

$('#sort div').each(function() { 
    var el = $(this); 
    map[el.attr('n')] = el; 
}); 

for (var i = 0, l = order.length; i < l; i ++) { 
    if (map[order[i]]) { 
     el.append(map[order[i]]); 
    } 
} 

Full code here

+0

出色地工作,即使$ .each()中的元素缺少其屬性 - 只是將元素放在頂部。當'var order'中的數字也從匹配元素集中丟失時它就起作用。 – tylerl 2015-03-10 16:25:27

5

未經測試...

$.fn.asort = function (order, attrName) { 
    for(var i = 0, len = order.length; i < len; ++i) { 
     this.children('[' + attrName + '=' + order[i] + ']').appendTo(this); 
    } 
} 
+0

工作正常,沒有分離。 – oodavid 2012-02-17 11:41:57

+0

是的,那時我不知道。將編輯它:) – 2012-02-18 04:50:39

0

我碰到這個偶然試圖解決我是什麼了。 我採取@ shrikant-sharat的方法,並添加了一點,因爲我需要排序的屬性實際上是一個子元素。想我會在這裏補充的情況下,它可以幫助任何人(併爲未來的我!)

$.fn.asort = function (order, attrName, filter) { 
    console.log(this.length, order.length, order); 
    for(var i = 0, len = order.length; i < len; ++i) { 

    if(typeof(filter) === 'function') { 
     filter(this.children(), attrName, order[i]).appendTo(this); 
    } else { 
     this.children('[' + attrName + '=' + order[i] + ']').appendTo(this); 
    } 
    } 
    return this.children(); 
} 

它可以讓你通過一個過濾器功能,你以後的元素相匹配。這不是我認爲最有效的方式,但它適用於我,例如:

$('.my-list').asort(mapViewOrder, 'data-nid', function(items, attrName, val) { 
    return items.filter(function(index, i) { 
    return ($(i).find('[' + attrName + '="' + val + '"]').length); 
    }); 
});