Сортировка объектов в массиве JavaScript по значению ключа - PullRequest
2 голосов
/ 19 ноября 2011

Я мог придумать невероятно грубый способ добиться такого рода результатов, но я решил, что я бы попросил многих экспертов, присутствующих здесь, на SO.По сути, у меня есть массив, который выглядит примерно так:

var bugs = [
    {
        id: "197526",
        title: "Updating Lighthouse",
        summary: "Enhancing the UI of Lighthouse",
        status: "Active",
        project: "Lighthouse",
        area: "Internal Web Applications",
        hours: 19
    },
    {
        id: "190328",
        title: "Adding Login Authentication to Lighthouse",
        summary: "Create a login authentication process for Lighthouse",
        status: "Active",
        project: "Lighthouse",
        area: "Administration",
        hours: 12
    },
    ...
    {
        id: "187562",
        title: "Create a Maintenance Page",
        summary: "Create a maintenance page to be displayed with the company site is down",
        status: "Resolved",
        project: "Other",
        area: "Internal Web Projects",
        hours: 4
    },
];

По сути, массив содержит несколько «ошибок», каждый из которых имеет идентификатор, заголовок, сводку, состояние, проект, область и часы.,Каждая из этих ошибок будет отображаться в моем веб-приложении, но я позволяю пользователю выбирать, как они будут сгруппированы;либо по статусу, проекту или области.В зависимости от того, какой из трех вариантов они выбирают в поле выбора выше, я хочу иметь возможность отсортировать все ошибки и сгруппировать их по любой категории, которую они выбрали.Затем, когда дело доходит до их отображения, создайте простой заголовок для каждой представленной опции для этой категории.Например, если бы они сортировали по статусу, это было бы что-то вроде:

Group By: Status

Active
------
Bug with status: "active"
Bug with status: "active"
Bug with status: "active"

Resolved
--------
Bug with status: "resolved"
Bug with status: "resolved"

Должен ли я выполнить итерацию по всему массиву ошибок и, основываясь на категории для сортировки, просто создать новый массивдля каждого возможного варианта этой категории и добавить к ним соответствующие ошибки?Итак, в случае выше, создать новые массивы var activeBugs = [] и var resolvedBugs = []?Если это так, то моей проблемой было бы знание возможных вариантов.Должен ли я сначала выполнить итерацию по всему массиву ошибок, чтобы увидеть, какие возможные опции присутствуют для категории группы желаний, прежде чем создавать эти новые массивы?

Каков наилучший способ сделать это, не прибегая к другим плагинам jQuery?

Ответы [ 4 ]

0 голосов
/ 19 ноября 2011

Чтобы уточнить мой комментарий, ставящий под сомнение необходимость сортировки / фильтрации вообще, можете ли вы сделать что-то (очень грубо) подобное в логике отображения?

$('#SortOrder').live('change', function() {
  var groupby = $(this).val();

  $('#Bugs').empty();

  for (var i = 0; i < bugs.length; i++) {
    if (!document.getElementById(bugs[i][groupby])) {
        $('<h3>', { text: bugs[i][groupby] }).appendTo('#Bugs');

        $('<ul>', {
            id: bugs[i][groupby]
        }).appendTo('#Bugs');
    }

    var $li = $('<li>', {
        text: bugs[i].title
    });

    $('#Bugs').find('#' + bugs[i][groupby]).append($li);
  }
});

Рабочая демонстрация: http://jsfiddle.net/TTApQ/1/

Таким образом, нет никакой сортировки или фильтрации, и вам нужно всего лишь сделать один проход по массиву.

0 голосов
/ 19 ноября 2011

Сортировка массива по статусу с помощью array.sort. Итерируйте по массиву, помня, каково было свойство .status предыдущей итерации. Когда это изменится, создайте новое визуальное представление.

bugs.sort(mySortFunc);

var lastStatus = '';
for (var i=0, b; b = bugs[i]; i++) {
  if (b.status != lastStatus) {
    //output a header for the new status b.status
    document.write(b.status + '<br>----<br>');
    lastStatus = b.status;
  }
  // output the bug
  document.write(b.title + '<br>');
}

Предупреждение: в конечном итоге вы захотите, чтобы база данных выполняла всю сортировку / группировку / разбиение на страницы / и т.д.

0 голосов
/ 19 ноября 2011

Вот пример использования .filter(), как я описал в своем комментарии:

var active_bugs = bugs.filter(function(bug) {
    return bug.status === "active";
});
0 голосов
/ 19 ноября 2011

Будет ли у пользователя копия всех ошибок?или вы просто отправляете, скажем, первые 100?

  • Если вы отправляете первые 100, я предлагаю вам создать на сервере 3 массива, которые содержат указатели на объекты и каждыйновый баг вставляется в соответствии с его положением.а затем просто отправить из списка, который был запрошен.это должно быть быстро, потому что вы просто извлекаете информацию.и сортировка во время вставки.(вся «сортировка» выполняется при добавлении ошибки - это предполагает, что вы просматриваете информацию чаще, чем редактируете ее!)
  • Если клиент хранит копию всех данных, просто пересортируйте еена клиенте с помощью JavaScript.не должен занимать слишком много времени.это экономит пропускную способность и предполагает, что у вас не так много ошибок, поэтому вы можете показать их все сразу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...