如何在Node.JS中对对象的数据进行减法?

问题描述 投票:0回答:1

我有检查员的数据。它包含当前和上个月的数据作为对象数组。现在,我需要查找当前和上个月数据的差异,并将差异分配给上个月的数据对象。

例如,我有以下数据。

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"
        }
    ]

现在,我想找到如下所示的区别。

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
        }
    ]

我已经尝试了以下代码来计算差异,但没有得到。

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;
        }, {})]

还有其他方法吗?

javascript node.js
1个回答
0
投票

此代码应按您的意愿进行操作,我们将创建上个月数据的映射,然后遍历数组并从当前月份中减去。

我通过遍历对象的属性并减去它们是否为数字,使它更加通用。

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);
© www.soinside.com 2019 - 2024. All rights reserved.