Исчисление с объектами в JavaScript - PullRequest
0 голосов
/ 13 октября 2019

У меня есть объект, который содержит 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
        }
    ]
}

let auxObj = {}

for (let i = 0; i < items.day_active.length; i++) {
  for (let j = 0; j < items.day_inactive.length; j++) {
    if (items.day_active[i].date == items.day_inactive[j].date && items.day_active[i].type == items.day_inactive[j].type) {
      // console.log("yes")
      auxObj.date = items.day_active[i].date
      auxObj.type = items.day_active[i].type
      auxObj.count = items.day_active[i].count - items.day_inactive[j].count
    }
  }
}

console.log(auxObj)

Как я могу решить эту проблему простым способом? Спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Следуйте комментариям для объяснения ...

// 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 } ]
1 голос
/ 13 октября 2019

Я думаю, что этот будет более эффективным, я назвал объект в честь меня, потому что ... 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);

Логика заключается в том, что мы создаем объект и создаем свойство для каждой датыприсутствовать в наборах данных, начиная с первых членов формулы, заканчивая вычитанием второй части и по умолчанию равным 0 для каждого соответствующего случая.

В конце вы можете выполнить итерацию свойствобъект, разделите строку на '_', чтобы прочитать дату и группу каждого свойства и создать массив результатов (если у вас есть проблемы с этим, дайте мне знать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...