2013-08-28 93 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 

然而,我需要基于从所述阵列的新的排序顺序上建立网格,而不是y中的字母正被现在使用。我需要根据不是按字母顺序排列的优先级来分割结果,而是希望在单独对象中定义的自定义排序(这是否为“关系数据库”),例如:

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数组(现在称它为deptorder,因为它赋予了dept和subdept的顺序),但它似乎还没有使用它。 (也就是employee.TITLE后需要逗号) –

+0

我可以告诉“订单”是正确的,因为我可以在日志中看到它.. 但结果数组未按此排序。它仍然按照雇员姓氏的字母顺序印刷它们。 –

+0

[过滤](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)条件是由独立于排序任务的'grep'完成的。感谢您发现缺少的逗号。我的错误是混淆了['$ .inArray'](http://api.jquery.com/jQuery.inArray)的奇数参数顺序,我应该使用[native'indexOf'方法](https:// developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)更好。现在应该修复。 – Bergi

相关问题