jQuery: сортировка результатов $ .each - PullRequest
1 голос
/ 17 января 2012

Единственные примеры, которые мне удалось найти для людей, использующих $.each, - это образцы html, и это не то, что я хочу.У меня есть следующий объект:

var obj = {
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
};

Я перебираю объект следующим образом:

$(array).each(function(index, value) {
    // ...
});

Я хочу отсортировать по obj3 и obj4.Желательно не использовать асинхронный метод, как я могу отсортировать результаты до (или во время) вывода?(Я также не хочу повторять это дважды, так как в любой момент времени могут быть сотни.

Ответы [ 2 ]

9 голосов
/ 17 января 2012
var array = {
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
};

не является массивом (несмотря на его имя).Это объект.Идея сортировки по obj3 и obj4 на самом деле не имеет смысла.

Теперь, если вы хотите преобразовать этот объект в массив объектов, вы можете отсортировать этот массив с помощью array.sortmethod.

var array = [
    { obj1: 39,
      obj2: 6,
      obj3: 'text'
      obj4: 'text'
      obj5: 0
    },{ obj1: 40,
      obj2: 7,
      obj3: 'text2'
      obj4: 'text3'
      obj5: 0
    }
];

array.sort(function(a, b) {

    var textA = a.obj3.toLowerCase();
    var textB = b.obj3.toLowerCase();

    if (textA < textB) 
       return -1; 
    if (textA > textB)
       return 1;
    return 0; 
});

и, конечно, для сортировки по числовому свойству это будет просто:

array.sort(function(a, b) {
    return a.obj1 - b.obj1;
});
4 голосов
/ 17 января 2012

Свойства объекта не имеют определенного порядка. Они не могут быть отсортированы. Массивы имеют порядок. Если вы хотите, чтобы ключи были в определенном порядке, вам придется поместить их в массив и определить порядок.

Вы можете извлечь все имена свойств (например, ключи) из объекта, отсортировать их и затем выполнить итерацию свойств в указанном порядке, если хотите. Чтобы сделать это, вы должны сделать это так:

var obj = {
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
};
var keys = [];
for (var prop in obj) {
    keys.push(prop);
}
keys.sort();
for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var value = obj[key];
    // do whatever you want to do with key and value
}

Как вы увидите, это требует дополнительной итерации для получения и сортировки списка ключей. Я не знаю, как обойти это. Получить ключи можно в современном браузере с obj.keys(), но внутри все равно это, вероятно, итерация свойств объекта, и вам понадобится прокладка, чтобы это работало в старых браузерах.

...