javascript如何快速获取员工数组中的报告总数

时间:2015-07-03 05:30:35

标签: javascript

我需要确定管理员在d3树形图可视化中指定正方形大小的报告总数。该数据是一个包含209000条记录的csv文件,其格式为:Employee,EmployeeID和ManagerID。

我必须找到的数字包括直接和间接报告 - 经理ID等于经理的员工身份的人和向下级经理报告的人,以及所有报告在公司阶梯下的人。

var i, theLength, j, thejLength, k, thekLength;
var runningCount = 0;
function getReportCount(csvAll, employeeId, employee) {
  var csvAllModified = csvAll.filter(function(d) {
      return (d.ManagerID == employeeId);
  });
  runningCount+= csvAllModified.length;
    i=0
    theLength = csvAllModified.length;
    for(; i < theLength; i++){ // LOOP THROUGH ONE LEVEL REPORTS
        //GET REPORTS TWO LEVEL BELOW
        csvAllModified2 = csvAll.filter(function(d) {
          return (d.ManagerID == csvAllModified[i].EmployeeID);
        });     
        //managerIds.push(csvAllModified[i].EmployeeID);
        runningCount += csvAllModified2.length;
        j=0;
        thejLength = csvAllModified2.length;
        for(; j < thejLength; j++ ){
            //GET REPORTS THREE LEVELS BELOW
            csvAllModified3 = csvAll.filter(function(d) {
              return (d.ManagerID == csvAllModified2[j].EmployeeID);
            });
            runningCount += csvAllModified3.length;
            k=0;
            thekLength = csvAllModified3.length;
            for(; k < thekLength; k++) {
                //console.log('Employee name 3 levels below: ' +         csvAllModified3[k].Employee); 
                csvAllModified4 = csvAll.filter(function(d) {
                  return (d.ManagerID == csvAllModified3[k].EmployeeID);
                });
                runningCount += csvAllModified4.length;
            }
        }
    }
  return runningCount
}

我的问题是:我如何构建上面的代码,以便更有效地运行?目前运行需要几分钟。我必须添加几个管理层才能获得最终总数。

1 个答案:

答案 0 :(得分:3)

您的代码很慢,因为您多次遍历大数组。您希望找到一种不必多次遍历原始数组的方法。在这种情况下,我会去csvAll.map(...)创建一个哈希,你可以直接引用一个报告,这样你就可以去报告[employeeID]来选择报告。 这样您只需要循环一次以创建hashmap,并且只需循环一次以查找初始managerID。您可以直接引用每个报告,而无需再次循环。