聚合一个对象,其中每个键的值是一个对象数组

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

我正在使用Underscore和Lodash按日期对数组进行分组。到目前为止,一切工作正常,我正在获得一个对象,其中每个键的值是对象数组,例如:

 {
    "april": [
      {
        "quantity": "200",
        "date": "05/04/2020, 23:43",
        "price": "150",
        "product": "Washing Machine",
        "provider": "LG",
        "total": 30000
      },
      {
        "quantity": "1000",
        "date": "10/04/2020, 00:35",
        "price": "800",
        "product": "Television",
        "provider": "Samsung",
        "total": 800000
      },
      {
        "quantity": "3000",
        "date": "10/04/2020, 18:02",
        "price": "2",
        "product": "Computer",
        "provider": "Sony",
        "total": 600000
      },
      {
        "quantity": "1000",
        "date": "10/04/2020, 18:03",
        "price": "300",
        "product": "Bluetooth Speaker",
        "provider": "Sony",
        "total": 300000
      }
    ],
    "march": [
      {
        "quantity": "400",
        "date": "18/03/2020, 23:47",
        "price": "230",
        "product": "Home Theatre",
        "provider": "Bose",
        "total": 92000
      }
    ],
    "february": [
      {
        "quantity": "550",
        "date": "07/02/2020, 23:52",
        "price": "300",
        "product": "Printer",
        "provider": "Epson",
        "total": 165000
      },
      {
        "quantity": "750",
        "date": "07/02/2020, 23:52",
        "price": "200",
        "product": "Television",
        "provider": "Panasonic",
        "total": 150000
      }
    ]
  } 

我想知道谁是每个月总计最大的提供商(例如,四月份是索尼,两次不同的购买,总额为90万美元),但是我一直试图访问和汇总数据。我知道Stackoverflow中有很多类似的问题,但是令人惊讶的是,我无法使用这种数据结构找到任何类似的问题。任何帮助将不胜感激。

javascript json aggregate underscore.js lodash
2个回答
0
投票

您可以在迭代列表时使用一个对象来累积每个提供者的总数。如果尚未将提供程序作为键添加到对象,则将其添加。每个resultObj.key(提供者)的价格可以轻松累加。

用于跟踪每个提供者的总价格和最大总提供者的对象的示例:

var resultObj = {
    "max" : {
        "num" : 0,          // max total goes here
        "provider" : ""     // provider name with max total goes here
    },
    getMax : function() {
        return this.max;    // returns the max object
    }
    //  provider keys will be assigned here
};

以及迭代对象数组的函数:

function getMaxValue() {
    obj.april.forEach(function(el) {                    
        if(resultObj[el.provider]) {             // if key exists
            resultObj[el.provider] += el.total;
        } else {                                 // key doesn't exist
            resultObj[el.provider] = el.total;
        }

        // check if the current total is greater than max
        if(resultObj[el.provider] > resultObj.max.num) {
            resultObj.max.num = resultObj[el.provider];
            resultObj.max.provider = el.provider;
        }
    });

    return resultObj.getMax();   // returns the max total and provider
}

检查并测试以下内容:

var obj = {
    "april": [
      {
        "quantity": "200",
        "date": "05/04/2020, 23:43",
        "price": "150",
        "product": "Washing Machine",
        "provider": "LG",
        "total": 30000
      },
      {
        "quantity": "1000",
        "date": "10/04/2020, 00:35",
        "price": "800",
        "product": "Television",
        "provider": "Samsung",
        "total": 800000
      },
      {
        "quantity": "3000",
        "date": "10/04/2020, 18:02",
        "price": "2",
        "product": "Computer",
        "provider": "Sony",
        "total": 600000
      },
      {
        "quantity": "1000",
        "date": "10/04/2020, 18:03",
        "price": "300",
        "product": "Bluetooth Speaker",
        "provider": "Sony",
        "total": 300000
      }
    ],
    "march": [
      {
        "quantity": "400",
        "date": "18/03/2020, 23:47",
        "price": "230",
        "product": "Home Theatre",
        "provider": "Bose",
        "total": 92000
      }
    ],
    "february": [
      {
        "quantity": "550",
        "date": "07/02/2020, 23:52",
        "price": "300",
        "product": "Printer",
        "provider": "Epson",
        "total": 165000
      },
      {
        "quantity": "750",
        "date": "07/02/2020, 23:52",
        "price": "200",
        "product": "Television",
        "provider": "Panasonic",
        "total": 150000
      }
    ]
  };
  
  var resultObj = {
    "max" : {
      "num" : 0,
      "provider" : ""
    },
    getMax : function() {
      return this.max;
    }
  };
  
  function getMaxValue() {
    obj.april.forEach(function(el) {
      if(resultObj[el.provider]) {
        resultObj[el.provider] += el.total;
      } else {
        resultObj[el.provider] = el.total;
      }
        
      if(resultObj[el.provider] > resultObj.max.num) {
        resultObj.max.num = resultObj[el.provider];
        resultObj.max.provider = el.provider;
      }
    });
    
    return resultObj.getMax();
  }
  

  console.log( getMaxValue() );

  console.log("\nNow to check resultObj");
console.log( resultObj );

0
投票

您可以结合使用map()map()来实现所需的功能,例如:

基于数据的键,我们获取每个月的公司数据数组,并减少对象,如果提供者已经存在,则累积它们的总数。然后,我们通过比较总数最高的数据来映射并减少结果数据,然后我们只需映射最终结果即可获得提供者的名称。

© www.soinside.com 2019 - 2024. All rights reserved.