2013-08-28 4 views
0

Я использую jQuery для разбора файла JSON сотрудников, который содержит их имя, отдел, подразделение и некоторые другие детали.Сортировка массива на основе пользовательского приоритета одного атрибута

например:

[ 
{ 
    "LAST":"Betsy", 
    "FIRST":"Jackson", 
    "DEPT":"Customer Service", 
    "SUBDEPT":"Tech Support", 
    "JOINED":"02/94", 
    "TITLE":"Technical Customer Service Representative", 
    "RESIDENCE":"Someplace", 
    "HOBBIES":"Reading, Walking, Sleeping" 
}, 
{ 
    "LAST":"Sally", 
    "FIRST":"Smith", 
    "DEPT":"Customer Service", 
    "SUBDEPT":"Installation Customer Service Representative", 
    "JOINED":"01/04", 
    "TITLE":"Technical Customer Service Representative", 
    "RESIDENCE":"Someplace", 
    "HOBBIES":"Reading, Walking, Sleeping" 
}, 
] 

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

Я успешно создал список имен сотрудников, с атрибутами data- *, которые хранят их отдел и подразделение. Когда щелкнули имя сотрудника, я смог разобрать файл JSON во второй раз, чтобы вернуть всех сотрудников, которые также находятся в этом отделе, и построить сетку, а затем переместить весь соответствующий объект-сотрудник в новый массив под названием « Результаты."

Примечание: отдел = данные отделу прошел селектор Jquery ..

$.each(data, function(i, employee) { 
    if (employee.DEPT == dept) { 
    var employeetext = '<span class="name">' 
    + employee.FIRST+' '+ employee.LAST+'</span>', 
    employee.JOINED, 
    employee.TITLE, 
    employee.RESIDENCE, 
    '...', 
    employee.HOBBIES; 

     $('#employees').append('<div class="employee_block"><img src="" width="85" height="113">' + employeetext + '.</div>'); 

     results.push(employee); 
} 
}) // end stepping through employees 

Однако, мне нужно, чтобы построить сетку на основе нового упорядоченный из массива, а не у алфавитного, что в настоящее время используется сейчас. Мне нужно разделить результаты по подразделу в соответствии с приоритетом, который не является алфавитным, а скорее настраиваемым, который я надеюсь определить в отдельном объекте (будет ли это «реляционная база данных?»), Например:

var subdeptorder = [ 
{ 
    "DEPT": "Marketing", 
    "SUBDEPTS": ["Administration", "Purchasing", "Advertising", "PR"] 
}, 
{ 
    "DEPT": "Sales", 
    "SUBDEPTS": ["Administration", "Business Development"] 
} 
] 

Так что мне нужно отсортировать массив результатов в соответствии с департаментом сотрудника (и его поддепозитом отдела).

Как написать функцию сравнения для повторной сортировки массива результатов в соответствии с приоритетом, установленным в отдельном объекте?

+2

использовать .sort и ссылаться на отдельный объект в логике, который возвращает -1 0 или 1 относительно узлов, которые в настоящее время сортируются. –

+0

Спасибо. Я должен упомянуть, что это будет мой первый раз с использованием .sort, так что любой addl. руководство ценится! –

+0

@JonathanLonowski: Если это вообще, это дубликат [Сортировка по индивидуальному заказу] (http://stackoverflow.com/questions/14872554/sorting-on-a-custom-order)! – Bergi

ответ

1

Формат отдельный объект, как это:

var subdeptorder = { 
    "Marketing": ["Administration", "Purchasing", "Advertising", "PR"], 
    "Sales": ["Administration", "Business Development"] 
}; 

Затем вы можете отсортировать данные следующим образом:

var dept = …; // the chosen one 

var results = $.grep(data, function(employee) { 
     return employee.DEPT = dept; 
    }), 
    order = subdeptorder[dept]; 
results.sort(function(a, b) { 
    // sort them by the indices of their SUBDEPTs in the order array 
    return $.inArray(a.SUBDEPT, order) - $.inArray(b.SUBDEPT, order); 
}); 
$.each(results, function(i, employee) { 
    $('#employees').append('<div class="employee_block"><img src="" width="85" height="113">' + [ 
     '<span class="name">'+employee.FIRST+' '+employee.LAST+'</span>', 
     employee.JOINED, 
     employee.TITLE, 
     employee.RESIDENCE, 
     '…', 
     employee.HOBBIES 
    ].join(' ') + '.</div>'); 
}); 

См Sorting on a custom order для оптимизированной версии (не используется $.inArray для индекса каждый раз) ,

+0

Я только хочу вернуть employee.DEPT = dept, если они совпадают, поэтому я завернул это в условное. Но это все еще печатает их в алфавитном порядке * после * первого сотрудника. Я не могу понять, как он собирает первого сотрудника только с этим кодом. Я настроил свой массив дептр-ордеров (теперь называю его deptorder, так как он назначает порядок деления и подделки), он, похоже, пока не использует его. (также, запятая, необходимая после сотрудника.TITLE) –

+0

Я могу сказать, что «заказ» прав, потому что я вижу его в журнале. , но массив результатов не сортируется в соответствии с этим. Он по-прежнему печатает их в соответствии с алфавитным порядком фамилии сотрудников. –

+0

Условие [filtering] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) выполняется с помощью 'grep', который не зависит от задачи сортировки. Спасибо, что заметили недостающую запятую.Моя ошибка путала нечетный порядок параметров ['$ .inArray'] (http://api.jquery.com/jQuery.inArray), я должен был использовать [собственный метод indexOf] (https: // developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) лучше. Должно быть исправлено сейчас. – Bergi

Смежные вопросы