Javascript 将一个关系的值乘以每个记录另一个关系的和

Javascript 将一个关系的值乘以每个记录另一个关系的和,javascript,laravel,eloquent,Javascript,Laravel,Eloquent,我正在计算一些东西。 所以基本上我所做的是获取所有的概要文件和他们的项目,以及这些项目上的负载关系、出价和计时器。每个项目都有一个出价,它有一个价值,每个项目可以有多个计时器 我想做的是,对于每个项目,计算计时器的开始时间和停止时间之间的差值,以小时为单位求和,然后乘以同一项目的投标值,然后全部作为和返回。 基本上,我想得到的总金额的人已经赢得(对于每个项目的所有时间在小时*投标价值) 目前,我正试图用javascript计算所有这些,这就是我目前所拥有的: calcul

我正在计算一些东西。 所以基本上我所做的是获取所有的概要文件和他们的项目,以及这些项目上的负载关系、出价和计时器。每个项目都有一个出价,它有一个价值,每个项目可以有多个计时器

我想做的是,对于每个项目,计算计时器的开始时间和停止时间之间的差值,以小时为单位求和,然后乘以同一项目的投标值,然后全部作为和返回。 基本上,我想得到的总金额的人已经赢得(对于每个项目的所有时间在小时*投标价值)

目前,我正试图用javascript计算所有这些,这就是我目前所拥有的:

            calculateTotalAmountEarned(projects) {
            let totalAmount = 0;
            let totalHours = 0;
            let total = moment.duration(0);
            let value = 0;
            projects.forEach((project) => {
                project.timers.forEach((timer) => {
                    if(timer.stopped_at) {
                        let started = moment(timer.started_at);
                        let stopped = moment(timer.stopped_at);
                        let time = moment.duration(stopped.diff(started));

                        total.add(time)
                    }
                    totalHours = +(total.asHours()).toFixed(0);
                })
                project.bids.forEach((bid) => {
                    value = bid.value
                })

                totalAmount = totalHours * value
            })

            return totalAmount
        },

现在它返回所有项目中所有计时器的总和乘以单个项目中单个出价的值

我现在得到的是:55小时,这是所有项目的所有计时器对一个配置文件的持续时间,乘以14,这是一次投标的价值

输入和预期输出示例: 项目1:3个计时器,每个计时器持续时间为1小时->总计3小时,投标价值为14 项目2与项目1等相同

所有项目的预期结果为(项目1=3*14)+(项目2=>3*14),依此类推

"projects":[  
     {  
        "id":1,
        "timers":[  
           {  
              "id":1,
              "name":"dfdsf",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:22",
              "stopped_at":"2018-05-23 11:48:25",
              "created_at":"2018-05-23 11:48:22",
              "updated_at":"2018-05-23 11:48:25",
           },
           {  
              "id":2,
              "name":"dfdsf343",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:28",
              "stopped_at":"2018-05-23 11:48:30",
              "created_at":"2018-05-23 11:48:28",
              "updated_at":"2018-05-23 11:48:30",
           },
           {  
              "id":3,
              "name":"dfdsf343zzxccz",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:33",
              "stopped_at":"2018-05-23 11:48:35",
              "created_at":"2018-05-23 11:48:33",
              "updated_at":"2018-05-23 11:48:35",
           },
           {  
              "id":4,
              "name":"dfdsf343zzxcczfgfg",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:37",
              "stopped_at":"2018-05-23 11:48:40",
              "created_at":"2018-05-23 11:48:37",
              "updated_at":"2018-05-23 11:48:40",
           },
           {  
              "id":5,
              "name":"asdfsadf",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 10:44:51",
              "stopped_at":"2018-05-24 11:12:55",
              "created_at":"2018-05-24 10:44:51",
              "updated_at":"2018-05-24 11:12:55",
           },
           {  
              "id":7,
              "name":"twqetqwtq",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 11:13:45",
              "stopped_at":"2018-05-24 12:08:22",
              "created_at":"2018-05-24 11:13:45",
              "updated_at":"2018-05-24 12:08:22",
           },
           {  
              "id":9,
              "name":"asd",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 12:08:29",
              "stopped_at":"2018-05-24 12:42:13",
              "created_at":"2018-05-24 12:08:29",
              "updated_at":"2018-05-24 12:42:13",
           },
           {  
              "id":11,
              "name":"1234",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 13:23:34",
              "stopped_at":"2018-05-26 08:30:41",
              "created_at":"2018-05-24 13:23:34",
              "updated_at":"2018-05-26 08:30:41",
           }
        ],
        "bids":[  
           {  
              "id":1,
              "value":"34",
              "created_at":"2018-05-22 12:25:37",
              "updated_at":"2018-05-22 12:25:55"
           }
        ],

好的,这是一个项目的相关信息-它的时间和出价-总是有一个出价。预期输出是每个计时器的停止时间与启动时间之差(单位:小时),求和并乘以bids值。每一个其他项目都会重复这一过程,所有这些都被总结为最终结果。我希望你能理解我的解释

希望这就是你想要的

它使用
.reduce
功能将项目减少为一个总数

(或者,如果我正确理解了这个问题,通过在
项目中移动
total
totalHours
value
的声明。对于每个
callback,您应该能够将
totalAmount=totalHours*value
替换为
totalAmount+=totalHours*value
,以获得正确的值。)值(使用原始函数)

let项目=[{
“id”:1,
“计时器”:[{
“id”:1,
“名称”:“dfdsf”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-23 11:48:22”,
“停在”:“2018-05-23 11:48:25”,
“创建时间”:“2018-05-23 11:48:22”,
“更新时间”:“2018-05-23 11:48:25”,
},
{
“id”:2,
“名称”:“dfdsf343”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-23 11:48:28”,
“停在”:“2018-05-23 11:48:30”,
“创建时间”:“2018-05-23 11:48:28”,
“更新时间”:“2018-05-23 11:48:30”,
},
{
“id”:3,
“名称”:“dfdsf343zzxccz”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-23 11:48:33”,
“停在”:“2018-05-23 11:48:35”,
“创建时间”:“2018-05-23 11:48:33”,
“更新时间”:“2018-05-23 11:48:35”,
},
{
“id”:4,
“名称”:“DFDSF343ZZXCZFGFGFG”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-23 11:48:37”,
“停在”:“2018-05-23 11:48:40”,
“创建时间”:“2018-05-23 11:48:37”,
“更新时间”:“2018-05-23 11:48:40”,
},
{
“id”:5,
“名称”:“asdfsadf”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-24 10:44:51”,
“停在”:“2018-05-24 11:12:55”,
“创建时间”:“2018-05-24 10:44:51”,
“更新时间”:“2018-05-24 11:12:55”,
},
{
“id”:7,
“名称”:“twqetqwtq”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-24 11:13:45”,
“停在”:“2018-05-24 12:08:22”,
“创建时间”:“2018-05-24 11:13:45”,
“更新时间”:“2018-05-24 12:08:22”,
},
{
“id”:9,
“名称”:“asd”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-24 12:08:29”,
“停在”:“2018-05-24 12:42:13”,
“创建时间”:“2018-05-24 12:08:29”,
“更新时间”:“2018-05-24 12:42:13”,
},
{
“id”:11,
“名称”:“1234”,
“项目id”:1,
“配置文件id”:2,
“开始时间”:“2018-05-2413:23:34”,
“停在”:“2018-05-26 08:30:41”,
“创建时间”:“2018-05-2413:23:34”,
“更新时间”:“2018-05-26 08:30:41”,
}
],
“投标书”:[{
“id”:1,
“价值”:“34”,
“创建时间”:“2018-05-22 12:25:37”,
“更新时间:”2018-05-22 12:25:55
}],
}]
让总数=项目。减少((总数,项目)=>{
//计算总时间
让totalHours=project.timers.reduce((totalTime,timer)=>{
让开始=时刻(计时器开始时间);
让停止=时刻(计时器停止时);
设m=时刻、持续时间(停止、差异(开始));
返回totalTime+数学圆(m.asHours())
}, 0);
//乘以投标价格,然后加总金额
返回total+totalHours*project.bids[0]。值;
}, 0);
console.log(“总计为”,总计)

那么问题是什么?有些东西工作不正常吗?你能给出一个输入示例和预期输出吗?现在,它返回所有项目中所有计时器的总和乘以单个项目中单个投标的值。输入示例和预期输出示例:项目1:3个计时器,每个计时器的持续时间为1小时->总计3小时,投标价值为14个项目2与项目1相同等预期结果为(项目1=3*14)+(项目2=>3*14)等等projects@Echo最好是JSON格式…@user184994很难格式化JSON,你真的需要它吗?相关字段在代码中:对于项目的计时器,开始和停止字段,对于项目的投标,投标值出于某种原因totalAmount+=totalHours*值对我不起作用解决方案