重新排序数组而不加扰原始排序

时间:2013-09-16 16:16:43

标签: javascript arrays json sorting

我有一系列员工信息,这些信息按员工子部门与给定部门内子部门的优先级进行比较排序。

因此,当在索引中单击员工姓名时,他们的部门(存储为数据属性)将用于抓取共享该部门的所有其他员工,并且此集合按照子部门优先级排序,在另一个阵列中手动设置

var results = $.grep(data, function(employee) {
    if(employee.DEPT == dept) {
        return employee.DEPT = dept;
    }
});

// ** NOTE 'deptorder' is "Department" : [ "Subdepartment1", "Subdepartment2" ] defined manually
// pick the order of subdepts based on the dept
order = deptorder[dept];

第一种:

results.sort(function(a, b) {
    return $.inArray(a.SUBDEPT, order) - $.inArray(b.SUBDEPT, order);
});

然后我浏览已排序的数组并创建一个员工信息网格,其中部分标题将员工按子部门划分。

问题:我需要在每个子部门中将员工安排到子部门组之后进行安排。我愿意接受有关如何做到这一点的建议,但我需要的是标记一个“经理”并将其作为给定子部门的网格中的第一个。在渲染管理器之后,其余部分可以按字母顺序排列,或者其他任何内容。

如何对阵列进行第二次排序以实现此目的?现在,经理的employee.MANAGER属性为“1”,其余的则为“。”。

我试过

results.sort(function(a, b) {
    return (a.MANAGER == 1) - b;
});

但这不起作用。上面显示的排序是我第一次也是唯一的排序体验。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

您可以在一个.sort()次传递中进行所有比较:

results.sort(function(a, b) {
  if (a.SUBDEPT == b.SUBDEPT) {
    if (a.MANAGER == 1)
      return -1; // a goes first
    if (b.MANAGER == 1)
      return 1; // b goes first
    return 0; // or compare names
  }
  return $.inArray(a.SUBDEPT, order) - $.inArray(b.SUBDEPT, order);
}

换句话说,在排序时,如果您注意到您正在比较同一部门中的两个元素,则检查是否是经理。如果是这样,那个应该在另一个之前。如果他们在不同的部门,那就重要了。

如果他们在同一个部门,但他们都不是经理,那么您可以按名称或其他任何你喜欢的方式进行比较。