gpt4 book ai didi

javascript - 按多个字段对 Json 数据进行分组

转载 作者:行者123 更新时间:2023-12-02 14:29:45 26 4
gpt4 key购买 nike

我有一个 JSON 数据,其中包含一些成员(member)作为俱乐部会费支付的付款列表。我正在尝试使用 underscore.js 库对数据进行分组并对数据进行求和。

下面提供了我的示例 JSON 数据。

var dues = [{
memberid: 194,
payment: [
{ month: 'January', amount: 2500, year: 2015 },
{ month: 'February', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2015 },
{ month: 'April', amount: 2500, year: 2015 },
{ month: 'May', amount: 2500, year: 2015 },
{ month: 'June', amount: 2500, year: 2015 },
{ month: 'July', amount: 2500, year: 2015 },
{ month: 'August', amount: 2500, year: 2015 },
{ month: 'September', amount: 2500, year: 2015 },
{ month: 'October', amount: 2500, year: 2015 },
{ month: 'November', amount: 2500, year: 2015 },
{ month: 'December', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2016 },
{ month: 'May', amount: 2500, year: 2016 },
{ month: 'September', amount: 2500, year: 2016 }
],
name: 'Makey Trashey'
}, {
memberid: 156,
payment: [
{ month: 'January', amount: 2500, year: 2015 },
{ month: 'February', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2015 },
{ month: 'April', amount: 2500, year: 2015 },
{ month: 'May', amount: 2500, year: 2015 },
{ month: 'June', amount: 2500, year: 2015 },
{ month: 'July', amount: 2500, year: 2015 },
{ month: 'August', amount: 2500, year: 2015 },
{ month: 'September', amount: 2500, year: 2015 },
{ month: 'October', amount: 2500, year: 2015 },
{ month: 'November', amount: 2500, year: 2015 },
{ month: 'December', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2016 },
{ month: 'May', amount: 2500, year: 2016 },
{ month: 'July', amount: 2500, year: 2016 }
],
name: 'Makey Johnny'
}
]

请问,我想按月对支付键数组中的 amount 键求和。

我希望能够按月分组,同时汇总一年中每个月支付的金额。我希望我的数据采用这种格式。

[{
month: 'January',
total: 'to be the amount of all amount paid in January'
year: 1995
}, {
month: 'February',
total: 'to be the amount of all amount paid in January'
year: 1995
}, {
month: 'March',
total: 'to be the amount of all amount paid in January'
year: 1995
}]

感谢您的帮助。

最佳答案

最简单的事情就是创建您自己的分组和哈希函数。

var dues = retrieveData();

var grouped = dues.reduce(function(groupedData, member, index, members) {
return member.payment.reduce(function(memberData, payment) {
var key = payment.month + '_' + payment.year;
if (memberData[key] == null) {
memberData[key] = {
month : payment.month,
total: payment.amount || 0,
year: payment.year
};
} else {
memberData[key].total += payment.amount; // Update payment.
}
return memberData;
}, groupedData);
}, {});

var valueArr = Object.keys(grouped).map(function(key) {
return grouped[key];
});

console.log(valueArr);


function retrieveData() {
return [ {
memberid: 194,
payment: [
{ month: 'January', amount: 2500, year: 2015 },
{ month: 'February', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2015 },
{ month: 'April', amount: 2500, year: 2015 },
{ month: 'May', amount: 2500, year: 2015 },
{ month: 'June', amount: 2500, year: 2015 },
{ month: 'July', amount: 2500, year: 2015 },
{ month: 'August', amount: 2500, year: 2015 },
{ month: 'September', amount: 2500, year: 2015 },
{ month: 'October', amount: 2500, year: 2015 },
{ month: 'November', amount: 2500, year: 2015 },
{ month: 'December', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2016 },
{ month: 'May', amount: 2500, year: 2016 },
{ month: 'September', amount: 2500, year: 2016 }
],
name: 'Makey Trashey'
}, {
memberid: 156,
payment: [
{ month: 'January', amount: 2500, year: 2015 },
{ month: 'February', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2015 },
{ month: 'April', amount: 2500, year: 2015 },
{ month: 'May', amount: 2500, year: 2015 },
{ month: 'June', amount: 2500, year: 2015 },
{ month: 'July', amount: 2500, year: 2015 },
{ month: 'August', amount: 2500, year: 2015 },
{ month: 'September', amount: 2500, year: 2015 },
{ month: 'October', amount: 2500, year: 2015 },
{ month: 'November', amount: 2500, year: 2015 },
{ month: 'December', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2016 },
{ month: 'May', amount: 2500, year: 2016 },
{ month: 'July', amount: 2500, year: 2016 }
],
name: 'Makey Johnny'
} ];
};

输出

[
{ "month": "January", "total": 5000, "year": 2015 },
{ "month": "February", "total": 5000, "year": 2015 },
{ "month": "March", "total": 5000, "year": 2015 },
{ "month": "April", "total": 5000, "year": 2015 },
{ "month": "May", "total": 5000, "year": 2015 },
{ "month": "June", "total": 5000, "year": 2015 },
{ "month": "July", "total": 5000, "year": 2015 },
{ "month": "August", "total": 5000, "year": 2015 },
{ "month": "September", "total": 5000, "year": 2015 },
{ "month": "October", "total": 5000, "year": 2015 },
{ "month": "November", "total": 5000, "year": 2015 },
{ "month": "December", "total": 5000, "year": 2015 },
{ "month": "March", "total": 5000, "year": 2016 },
{ "month": "May", "total": 5000, "year": 2016 },
{ "month": "September", "total": 2500, "year": 2016 },
{ "month": "July", "total": 2500, "year": 2016 }
]
<小时/>

通用方法

下面,我将数据与上面的代码解耦,并将逻辑放入其自己的函数中。它远非完美,但它是一个开始。

var dues = retrieveData();
var valueArr = groupData(dues, 'payment', ['month', 'year'], 'amount', 'total');

console.log(valueArr);

function groupData(data, targetProp, keys, accumFrom, accumTo) {
var grouped = data.reduce(function(groupedData, item, index, items) {
return item[targetProp].reduce(function(obj, record) {
var key = keys.map(function(key) { return record[key]; }).join('_');
if (obj[key] == null) {
obj[key] = keys.reduce(function(data, key) {
data[key] = record[key];
return data;
}, {});
}
obj[key][accumTo] = (obj[key][accumTo] || 0) + record[accumFrom];
return obj;
}, groupedData);
}, {});

return Object.keys(grouped).map(function(key) {
return grouped[key];
});
}

function retrieveData() {
return [ {
memberid: 194,
payment: [
{ month: 'January', amount: 2500, year: 2015 },
{ month: 'February', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2015 },
{ month: 'April', amount: 2500, year: 2015 },
{ month: 'May', amount: 2500, year: 2015 },
{ month: 'June', amount: 2500, year: 2015 },
{ month: 'July', amount: 2500, year: 2015 },
{ month: 'August', amount: 2500, year: 2015 },
{ month: 'September', amount: 2500, year: 2015 },
{ month: 'October', amount: 2500, year: 2015 },
{ month: 'November', amount: 2500, year: 2015 },
{ month: 'December', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2016 },
{ month: 'May', amount: 2500, year: 2016 },
{ month: 'September', amount: 2500, year: 2016 }
],
name: 'Makey Trashey'
}, {
memberid: 156,
payment: [
{ month: 'January', amount: 2500, year: 2015 },
{ month: 'February', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2015 },
{ month: 'April', amount: 2500, year: 2015 },
{ month: 'May', amount: 2500, year: 2015 },
{ month: 'June', amount: 2500, year: 2015 },
{ month: 'July', amount: 2500, year: 2015 },
{ month: 'August', amount: 2500, year: 2015 },
{ month: 'September', amount: 2500, year: 2015 },
{ month: 'October', amount: 2500, year: 2015 },
{ month: 'November', amount: 2500, year: 2015 },
{ month: 'December', amount: 2500, year: 2015 },
{ month: 'March', amount: 2500, year: 2016 },
{ month: 'May', amount: 2500, year: 2016 },
{ month: 'July', amount: 2500, year: 2016 }
],
name: 'Makey Johnny'
} ];
};

关于javascript - 按多个字段对 Json 数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37942832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com