Сортировать список по атрибуту данных (используя плагин метаданных jquery) - PullRequest
8 голосов
/ 23 ноября 2010

Мне трудно разобраться, как сортировать список по одной из пар ключ / значение в атрибуте данных.

<ul>
    <li data="{name:'Foo', number: '1'}">
        <h3>Foo</h3>
    </li>

    <li data="{name:'Bar', number: '2'}">
        <h3>Bar</h3>
    </li>
</ul>

Вот jQuery.Я устанавливаю метаданные attr и получаю к ним доступ.Все это прекрасно работает.

jQuery.metadata.setType("attr", "data");

$(document).ready(function(){   

    // loop through each list item and get the metadata
    $('ul li').each(function () {  
        console.log($(this).metadata());
        // shows the following - Object {name="Foo", number="1"}
    });

)};

Пример: мне нужно отсортировать по имени по возрастанию.Может кто-нибудь направить меня в правильном направлении?

РЕДАКТИРОВАТЬ:

Вот форма, которую я использую для запуска сортировки:

<form name="filterForm">
    Sort: 
    <select name="sort" size="1">
        <option value="nameAsc" <cfif URL.sort EQ 1>selected="selected"</cfif>>Name A to Z</option>
        <option value="nameDesc" <cfif URL.sort EQ 2>selected="selected"</cfif>>Name Z to A</option>
        <option value="numberAsc" <cfif URL.sort EQ 3>selected="selected"</cfif>>Number 1-10</option>
        <option value="numberDesc" <cfif URL.sort EQ 4>selected="selected"</cfif>>Number 10-1</option>
    </select> 
</form> 

И jquery для обработки события изменения, но я не уверен, что правильно реализовал код Микаэля Элиассона, потому что я не уверен, куда передать значение того, что было выбрано:

$('form[name=filterForm] select').change(function(){

    var sortBy = this.value;

    var arr = []

    // loop through each list item and get the metadata
        $('ul li').each(function () {  
            var meta = $(this).metadata();
            meta.elem = $(this);
            arr.push(meta);
        });

    arr.sort(appendItems());

    function appendItems(){

        //Foreach item append it to the container. The first i arr will then end up in the top
        $.each(arr, function(index, item){
            item.elem.appendTo(item.elem.parent());
        }       

    }


});

1 Ответ

6 голосов
/ 23 ноября 2010

Javascript имеет функцию сортировки, которая может принимать функцию в качестве аргумента. Эта функция должна использоваться, когда у вас есть пользовательские сравнения. Смотри http://www.w3schools.com/jsref/jsref_sort.asp

Так что я бы сделал что-то вроде этого

var arr = []
// loop through each list item and get the metadata
    $('ul li').each(function () {  
        var meta = $(this).metadata();
        meta.elem = $(this);
        arr.push(meta);
    });
 arr.sort(compare);

//Foreach item append it to the container. The first i arr will then end up in the top
$.each(arr, function(index, item){
    item.elem.appendTo(item.elem.parent());
});

РЕДАКТИРОВАТЬ: обновлен синтаксис выше. Каждый цикл - исправление ошибки синтаксиса

EDIT: исправлена ​​ошибка в каждом последнем цикле

EDIT2: по запросу я обновляюсь с функцией сравнения

function compare(a, b){
   return a.name - b.name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...