为了账号安全,请及时绑定邮箱和手机立即绑定

javascript中对象的微积分

javascript中对象的微积分

紫衣仙女 2021-11-18 20:18:52
我有一个包含 2 个字段的对象:day_active和day_inactive. (该对象在下面的 javascript 片段中)而我想要获得的是另一个基于这个公式的对象:count(day_active (在日期 x))-count(day_inactive (在日期 x){    {        "date" : "2019-09-19",        "type" : "groupC",        "count" : 2.0 // (5.0 - 3.0) - how many groupC were on day_active(2019-09-19) minus how many groupC were on day_inactive(2019-09-19)     },    {        "date" : "2019-09-19",        "type" : "groupW",        "count" : -2.0 // (3.0 - 5.0)    },    {        "date" : "2019-09-11",        "type" : "groupW",        "count" : -2.0 // (8.0 - 10.0)    },    {        "date" : "2019-10-08",        "type" : "groupW",        "count" : 7.0 // (7.0 - 0.0)    }}我试过这段代码,但没有考虑所有情况,结果不完整:let items = {    "day_inactive" : [         {            "date" : "2019-09-19",            "type" : "groupC",            "count" : 3.0        },         {            "date" : "2019-09-11",            "type" : "groupW",            "count" : 10.0        },         {            "date" : "2019-09-19",            "type" : "groupW",            "count" : 5.0        },        {            "date" : "2019-10-07",            "type" : "groupW",            "count" : 9.0        },        {            "date" : "2019-10-05",            "type" : "groupW",            "count" : 3.0        },    ],    "day_active" : [         {            "date" : "2019-09-11",            "type" : "groupW",            "count" : 8.0        },        {            "date" : "2019-09-19",            "type" : "groupW",            "count" : 3.0        },        {            "date" : "2019-10-08",            "type" : "groupW",            "count" : 7.0        },         {            "date" : "2019-09-19",            "type" : "groupC",            "count" : 5.0        }    ]}我怎样才能以简单的方式解决这个问题?感谢您的时间!
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

按照评论进行解释......


// let's create an empty object

let output = {};


// and start copying active days...

for (const obj of items.day_active) {

    // the following `key` is just for grouping purposes...

    const key = `${obj.date}-${obj.type}`;

    output[key] = { ...obj };

}


// Now let's look at inactive days...

for (const obj of items.day_inactive) {

    // the following `key` is just for grouping purposes...

    const key = `${obj.date}-${obj.type}`;


    // is this the first time we're looking at this `date-type`? let's add it with 0 count

    if (!output[key]) {

        output[key] = { ...obj, count: 0 };

    }


    // and subtract it from active days count

    output[key].count -= obj.count;

}


// let's remove the `key` we created earlier...

output = Object.values(output);


// here's the output

console.log(output);

从给定的样本输入中,这是我们得到的结果:


[ { date: '2019-10-11', type: 'groupW', count: -2 },

  { date: '2019-10-19', type: 'groupW', count: 3 },

  { date: '2019-10-08', type: 'groupW', count: 7 },

  { date: '2019-10-19', type: 'groupC', count: 5 },

  { date: '2019-09-19', type: 'groupC', count: -3 },

  { date: '2019-09-19', type: 'groupW', count: -5 },

  { date: '2019-10-07', type: 'groupW', count: -9 },

  { date: '2019-10-05', type: 'groupW', count: -3 } ]


查看完整回答
反对 回复 2021-11-18
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

我认为这个会更有效率,我以我的名字命名了这个对象,因为...idn


        let marios = {};    

        items.day_active.forEach(d => marios[d.date+'_'+d.type] = d.count || 0);

        items.day_inactive.forEach(d => marios[d.date+'_'+d.type] =  marios[d.date+'_'+d.type] ? marios[d.date+'_'+d.type] - (d.count || 0) : (d.count || 0));

        console.log(marios);

其背后的逻辑是,我们创建一个对象,并为数据集中的每个日期创建一个属性,从formla 的第一项开始,以第二部分的减法结束,并且默认为每个合适的日期为0案件。


最后,您可以迭代对象的属性,在 '_' 上拆分字符串以读取每个属性的日期和组并创建结果数组(如果您遇到问题,请告诉我)


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 353 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信