基于一个属性的自定义优先级对数组进行排序

时间:2013-08-28 21:32:41

标签: javascript jquery arrays json sorting

我正在使用jQuery来解析员工的JSON文件,其中包含他们的姓名,部门,子部门和其他一些细节。

e.g:

[
{
  "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文件,同时返回该部门中的所有员工,并构建网格,然后将整个匹配的员工对象推送到名为“结果。“

注意:dept =由jquery选择器传递的data-dept ..

$.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

但是,我需要根据数组中新的排序顺序构建网格,而不是现在使用的字母顺序。我需要按子部门划分结果,根据不按字母顺序排列的优先级,而是我希望在单独的对象中定义的自定义顺序(这将是“关系数据库吗?”),例如:< / p>

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

所以我需要根据员工的部门(以及该部门的子部门订单)对“结果”数组进行排序。

如何根据在单独对象中建立的优先级编写比较函数来重新排序“results”数组?

1 个答案:

答案 0 :(得分:2)

将单独的对象格式化为:

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索引。)