我正在使用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中有很多类似的问题,但是令人惊讶的是,我无法使用这种数据结构找到任何类似的问题。任何帮助将不胜感激。
您可以在迭代列表时使用一个对象来累积每个提供者的总数。如果尚未将提供程序作为键添加到对象,则将其添加。每个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 );