элемент сортировки jquery со значением массива - PullRequest
4 голосов
/ 25 августа 2010

Мне нужно отсортировать некоторые элементы в зависимости от его атрибута.Например:

<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>

Ответы [ 3 ]

7 голосов
/ 25 августа 2010
​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]]);
    }
}

Полный код здесь

5 голосов
/ 25 августа 2010

непроверено ...

$.fn.asort = function (order, attrName) {
    for(var i = 0, len = order.length; i < len; ++i) {
        this.children('[' + attrName + '=' + order[i] + ']').appendTo(this);
    }
}
0 голосов
/ 27 марта 2017

Я наткнулся на это, пытаясь исправить то, что я был после.Я взял метод @ 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);
  });
});
...