2010-08-25 82 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); 
    }); 
});