Reputation: 424
I've the data of a censor. It consists of current and previous month's data as an array of objects. Now I need to find the difference of current and previous month's data and assign the difference to the previous month's data object.
For example, I've the following data.
deviceData = [
{
"_id": "sb-0001",
"heat": 100,
"humidity": 200,
"time": "This Month"
},
{
"_id": "a-1",
"heat": 60,
"humidity": 40,
"time": "This Month"
},
{
"_id": "a-1",
"heat": 20,
"humidity": 10,
"time": "Last Month"
},
{
"_id": "sb-0001",
"heat": 20,
"humidity": 30,
"time": "Last Month"
}
]
Now I want to find the difference like the following.
deviceData = [
{
"_id": "sb-0001",
"heat": 100,
"humidity": 200,
"time": "This Month"
},
{
"_id": "a-1",
"heat": 60,
"humidity": 40,
"time": "This Month"
},
{
"_id": "a-1",
"heat": 20,
"humidity": 10,
"time": "Last Month",
"diff_heat":40,
"diff_humidity":30
},
{
"_id": "sb-0001",
"heat": 20,
"humidity": 30,
"time": "Last Month",
"diff_heat":80,
"diff_humidity":170
}
]
I've tried the following code to calculate the difference but didn't get that.
let difference;
difference = [templateData.reduce((obj, n) => {
for (var prop in n) {
if (obj.hasOwnProperty(prop) && obj['time']==n['time']) obj[prop] -= n[prop];
else obj[prop] = n[prop];
}
return obj;
}, {})]
Is there any other way to do that?
Upvotes: 2
Views: 181
Reputation: 30705
This code should do what you wish, we create a map of last month's data, then loop through the array and subtract from the current month.
I've made this a little more generic by looping over properties of the objects and subtracting if they are numbers.
const deviceData = [ { "_id": "sb-0001", "heat": 100, "humidity": 200, "time": "This Month" }, { "_id": "a-1", "heat": 60, "humidity": 40, "time": "This Month" }, { "_id": "a-1", "heat": 20, "humidity": 10, "time": "Last Month" }, { "_id": "sb-0001", "heat": 20, "humidity": 30, "time": "Last Month" } ];
let lastMonthData = deviceData.reduce((acc, el) => {
if (el.time === "Last Month") {
acc[el._id] = el;
}
return acc;
}, {});
let result = deviceData.reduce((acc, el) => {
if (el.time === "This Month" && lastMonthData[el._id]) {
Object.entries(el).forEach(([key,val]) => {
if (Number.isFinite(lastMonthData[el._id][key])) {
lastMonthData[el._id][key + "_diff"] = val - lastMonthData[el._id][key];
}
});
}
acc.push(el);
return acc;
}, []);
console.log("Result:", result);
Upvotes: 1