Упорядочить неупорядоченную группу элементов по идентификатору или классу с помощью jQuery

#jquery

#jquery

Вопрос:

Возможно ли упорядочить группу Div по идентификатору или классу с помощью jQuery? Вот мой код:

 <div id="product_categories">
  <div class="wpsc_categorisation_group" id="categorisation_group_49">
        <a href="http://africa.local/store/african-dolls/">African Dolls</a>
  </div>
  <div class="wpsc_categorisation_group" id="categorisation_group_47">
        <a href="http://africa.local/store/anklets/">Anklets</a>
  </div>
  <div class="wpsc_categorisation_group" id="categorisation_group_5">
        <a href="http://africa.local/store/bracelets/">Bracelets</a>
  </div>
  <div class="wpsc_categorisation_group" id="categorisation_group_11">
        <a href="http://africa.local/store/childrens-jewelry/">Children's Jewelry</a>
  </div>
  <div class="wpsc_categorisation_group" id="categorisation_group_13">
        <a href="http://africa.local/store/clearance/">Clearance</a>
  </div>
  <div class="wpsc_categorisation_group" id="categorisation_group_8">
        <a href="http://africa.local/store/cross-necklaces/">Cross Necklaces</a>
  </div>
</div>
  

Я знаю, что код немного перепутан, но WP E-Commerce генерирует его и не позволяет мне упорядочивать его так, как я хочу. Есть мысли?

Спасибо.

Ответ №1:

Хотя уже есть несколько других, я добавлю и это! Здесь используются регулярные выражения для удаления числа.

 var container = $("#product_categories");
var ele = container.children("div.wpsc_categorisation_group");

ele.detach().sort(function (a, b) {
    var a = $(a).attr('id').match(/d /);
    var b = $(b).attr('id').match(/d /);
    return a-b;
});
container.append(ele);
  

Надеюсь, это поможет!

Комментарии:

1. Это должно быть помечено как принятый ответ, поскольку у него нет проблем, если два элемента имеют одинаковое значение.

Ответ №2:

Я придумал черновик. Этот код, скорее всего, можно сильно почистить, но вот что вы делаете

Демонстрация: http://jsfiddle.net/3paUL /

 $('#sort').click(function() {
    var ids = [];
    var divs = {};
    $('#product_categories div.wpsc_categorisation_group').each(function() {
        var numPart = parseInt($(this).attr('id').substr($(this).attr('id').lastIndexOf('_')   1));
        ids.push(numPart);
        divs[numPart] = $(this);

    });
    ids.sort(sortNumber);
    $('#product_categories').html('');

    for (id in ids) {
        $('#product_categories').append(divs[ids[id]]);
    }
});

function sortNumber(a, b) {
    return a - b;
}
  

Как это работает: он просматривает идентификаторы элементов DIV внутри и сортирует их. Поскольку все ваши элементы DIV следуют шаблону из _ и числа, я удаляю это число и использую его в качестве индекса.

Комментарии:

1. Я думаю, что на самом деле я собираюсь выбрать ваш вариант… из всех опубликованных вариантов, я думаю, этот сработал лучше всего. Я сделаю все, что смогу, чтобы очистить ее и обновить выше. Спасибо!

Ответ №3:

Я бы использовал .sort и так что-то вроде этого:

 var ids = $(".wpsc_categorisation_group").map(function(){
    return parseInt(this.id.replace('categorisation_group_',''));
}).toArray().sort();

$.each(ids, function(){
    $('#categorisation_group_' this).prependTo("#product_categories");
});
  

Проверьте мой тестовый пример на jsFiddle;

Комментарии:

1. очень приятный краткий код! Однако, только одна вещь, вам нужно будет использовать пользовательскую сортировку по номерам, потому что сортировка не выполняется должным образом

2. Хорошее решение, но использовать parseInt без основы — плохая привычка. Ссылка

3. @JohnP, да, я это заметил… Мне пришлось бежать, поэтому у меня не было времени это исправить 😉

Ответ №4:

Вы можете использовать плагин sortElements: http://james.padolsey.com/javascript/sorting-elements-with-jquery /

 $('.wpsc_categorisation_group').sortElements(function(a, b){
    return parseInt(a.id.replace('categorisation_group_', ''), 10) > parseInt(b.id.replace('categorisation_group_', ''), 10) ? 1 : -1;
});
  

здесь вы можете найти тестовый пример jsFiddle

Комментарии:

1. Я собираюсь использовать этот вариант, поскольку это уже работающий плагин. Спасибо, Кара.

2. на самом деле я солгал… вместо этого я собираюсь использовать приведенный выше вариант. Спасибо, чувак.

Ответ №5:

Поехали!

 function orderDivs()
{
    var divs = [];
    $("#product_categories .wpsc_categorisation_group").each(function() {
        divs.push($(this));
    });
    // sort using a custom compare function
    divs.sort(byID);
    // empty the old contents
    $("#product_categories").empty();
    // put the ordered divs back in the same container
    for (var i=0; i < divs.length; i  ) {
        $("#product_categories").append(divs[i]);
    }
}
function byID(a, b)
{
    // extract number from id
    var a_id_num = parseInt($(a).attr("id").split("_")[2], 10);
    var b_id_num = parseInt($(b).attr("id").split("_")[2], 10);
    // compare with the other
    if(a_id_num > b_id_num) {
        return 1;
    } else {
        return 0;
    }
}

$(function() {
    // ready, go!
    orderDivs();
});
  

Рабочий пример на JSFiddle: http://jsfiddle.net/PnDLw /

Комментарии:

1. Спасибо, но я проверил код, и он по-прежнему не упорядочивает div по идентификатору.

2. Упс! Были некоторые ошибки в пользовательской функции сортировки. Исправлено (отредактировано выше). Вот также рабочая версия jsfiddle.net/CxymK