Javascript 各部门总计(不含重复项)

Javascript 各部门总计(不含重复项),javascript,angularjs,Javascript,Angularjs,我想计算每个部门的总数,不重复 昨天用户@yBrodsky帮了我,并建议使用SQL,但今天我想添加几个选项,但我不能在SQL中这样做 主要问题: 我有这样一个数组: var data = [{ dept:"test", task_time:"83" },{ dept:"test", task_time:"41" },{ dept:"other", task_time:"10" }]; 我想对每个部门的任务时间求和:例如test=124,other=10。 有一个函数应该

我想计算每个部门的总数,不重复

昨天用户@yBrodsky帮了我,并建议使用SQL,但今天我想添加几个选项,但我不能在SQL中这样做

主要问题:

我有这样一个数组:

var data = [{
  dept:"test",
  task_time:"83"
},{
  dept:"test",
  task_time:"41"
},{
  dept:"other",
  task_time:"10"
}];
我想对每个部门的任务时间求和:例如test=124,other=10。 有一个函数应该计算它,但它的工作原理类似于test=83。测试=41,其他=10。并显示每个部门,而不是一个部门的总和

有功能

var totalPerDept = {};
angular.forEach(data, function(item) {
  if(!totalPerDept[item.dept]) {
    totalPerDept[item.dept] = 0;
  }
  totalPerDept[item.dept] += parseFloat(item.task_time);
});
以下是上面的片段:

var数据=[{
部门:“测试”,
任务时间:“83”
},{
部门:“测试”,
任务时间:“41”
},{
部门:“其他”,
任务时间:“10”
}];
var totalPerDept={};
角度.forEach(数据、功能(项){
如果(!totalPerDept[项目部门]){
totalPerDept[物料部门]=0;
}
totalPerDept[item.dept]+=parseFloat(item.task\u时间);
});
控制台日志(totalPerDept)

我对您的代码做了一些修改,以获得一个具有您想要的结果的数组:

     function sumDeptData() {
        var data = [{
              dept:"test",
              task_time:"83"
            },{
              dept:"test",
              task_time:"41"
            },{
              dept:"other",
              task_time:"10"
            }];

        var totalPerDept = [];

        angular.forEach(data, function(item) {
            var index = findWithAttr(totalPerDept, 'dept', item.dept);

            if (index < 0) {
                totalPerDept.push({
                    dept: item.dept,
                    total: parseFloat(item.task_time)
                });
            } else {
                totalPerDept[index].total += parseFloat(item.task_time);
            }
        });

        return totalPerDept;
    }

    function findWithAttr(array, attr, value) {
        for(var i = 0; i < array.length; i += 1) {
            if(array[i][attr] === value) {
                return i;
            }
        }
        return -1;
    }
函数sumDeptData(){
风险值数据=[{
部门:“测试”,
任务时间:“83”
},{
部门:“测试”,
任务时间:“41”
},{
部门:“其他”,
任务时间:“10”
}];
var totalPerDept=[];
角度.forEach(数据、功能(项){
var索引=findWithAttr(totalPerDept,'dept',item.dept);
如果(指数<0){
全速推进({
部门:项目部,
总计:parseFloat(项目任务时间)
});
}否则{
totalPerDept[index].total+=parseFloat(项.任务\时间);
}
});
返回部门;
}
函数findWithAttr(数组、属性、值){
对于(变量i=0;i

sumDeptData()返回[{“dept”:“test”,“total”:124},{“dept”:“other”,“total”:10}]

下面是一个使用纯JavaScript的示例

var数据=[{
部门:“测试”,
任务时间:“83”
}, {
部门:“测试”,
任务时间:“41”
}, {
部门:“其他”,
任务时间:“10”
}],
米纳尔=[];
data.forEach(函数(v){
如果(!本[v.dept]){
这个[部门]={
部门:v.dept,
任务时间:0
};
minArr.push(这个[部门]);
}
this[v.dept].task_time=parseInt(this[v.dept].task_time)+parseInt(v.task_time);
}, {});

控制台日志(minArr)“有一个函数应该计算它,但它的工作原理类似于test=83.test=41和other=10”不,它不是。这正是你说的你想要的。我已经将它复制到一个片段中供您演示。您是否研究过使用
数组.prototype.reduce
?等等,您提供的代码正是您想要的。。。“示例测试=124,其他=10”@evolutionxbox:以上都可以。你也可以使用
reduce
(尽管有人说如果累加器不改变,这是一种滥用,而不是使用,因为它不会在上面改变)。你的代码很好,根据代码片段,它工作得很好..你的代码可以工作,代码@Javi_Swift也可以工作,但是。。。如果我有来自JSON的数据,看起来像你的数组,它不工作,嗯?它的总价值仅为椭圆形255@NelsonBiggety也许你是在总结字符而不是数字?@Javi_Swift在数据库中是这样的INTEGER@NelsonBiggety您是在客户端(JS)还是在服务器(服务、数据库等)中获得255?如果您在JS控制器中得到这个结果,那么看起来您得到的JSON值是一个字符串,将其ASCII值相加。尝试在求和之前将它们转换为num。在我的代码中,我使用parseFloat函数来完成这个任务。