首页 > 解决方案 > 如何在 Node.JS 中对对象的数据执行减法?

问题描述

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

例如,我有以下数据。

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

有没有其他方法可以做到这一点?

标签: javascriptnode.js

解决方案


这段代码应该如你所愿,我们创建上个月数据的映射,然后循环遍历数组并从当前月份中减去。

我通过遍历对象的属性并减去它们是否是数字来使这个更通用一点。

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);


推荐阅读