[英]How to sum object values by a key value that is an date object?
如果“基准”相同,我会尝试将所有“Menge”和“Fehler”值相加。 问题是“基准”是日期 object。
var arr = [{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":100,"Fehler":5},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":5,"Fehler":1},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":6,"Fehler":65},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"222","Menge":10,"Fehler":5},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"444","Menge":29,"Fehler":1},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":1,"Fehler":1}] console.log(arr) var holder = {}; arr.forEach(function (d) { if (holder.hasOwnProperty(d.Datum)) { holder[d.Datum] = holder[d.Datum] + d.Menge; } else { holder[d.Datum] = d.Menge; } }); var obj2 = []; for (var prop in holder) { obj2.push({ Datum: prop, Menge: holder[prop] }); } console.log(obj2);
但结果应该是:
[
{
"Datum": "2000-01-01",
"Menge": 121,
"Fehler": 76
},
{
"Datum": "2000-01-02",
"Menge": 30,
"Fehler": 2
}
]
如果您忽略时区和时间部分,您可以提取如下日期部分并将其用作holder
的密钥。
var arr = [{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":100,"Fehler":5},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":5,"Fehler":1},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":6,"Fehler":65},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"222","Menge":10,"Fehler":5},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"444","Menge":29,"Fehler":1},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":1,"Fehler":1}] var holder = {}; arr.forEach(function (d) { const dateStr = d.Datum.date.substring(0, 10); if (holder.hasOwnProperty(dateStr)) { var existing = holder[dateStr]; holder[dateStr] = { Datum: dateStr, Menge: existing.Menge + d.Menge, Fehler: existing.Fehler + d.Fehler, }; } else { holder[dateStr] = { Datum: dateStr, Menge: d.Menge, Fehler: d.Fehler, }; } }); var obj2 = Object.values(holder); console.log(obj2);
替代方式;
var arr = [{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":100,"Fehler":5},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":5,"Fehler":1},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":6,"Fehler":65},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"222","Menge":10,"Fehler":5},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"444","Menge":29,"Fehler":1},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":1,"Fehler":1}]
var Arrr = [];
arr.forEach(function (d) {
var dateArr = d.Datum.date.split(" ");
if(Arrr.find(x=> x.Datum ===dateArr[0]))
{
Arrr.find(x=> x.Datum ===dateArr[0]).Fehler += d.Fehler;
Arrr.find(x=> x.Datum ===dateArr[0]).Menge += d.Menge;
}
else {
Arrr.push({
Datum: dateArr[0],
Menge: d.Menge,
Fehler:d.Fehler
});
}
});
console.log(Arrr);
一种ES6方式并按 hash 解决方案分组:
const arr = [{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":100,"Fehler":5},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":5,"Fehler":1},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":6,"Fehler":65},{"Datum":{"date":"2000-01-01 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"222","Menge":10,"Fehler":5},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"444","Menge":29,"Fehler":1},{"Datum":{"date":"2000-01-02 00:00:00.000000","timezone_type":3,"timezone":"Europe/Berlin"},"Material":"123","Menge":1,"Fehler":1}] const result = Object.values(arr.reduce((acc, obj) => { const [Datum] = obj.Datum.date.split(' '); const Menge = (acc[Datum]?.Menge + obj.Menge) || obj.Menge; const Fehler = (acc[Datum]?.Fehler + obj.Fehler) || obj.Fehler; const Ratio = Fehler / Menge; acc[Datum] = { Datum, Menge, Fehler, Ratio }; return acc; }, {})); console.log(result);
.as-console-wrapper{min-height: 100%;important: top: 0}
或者,如果您的时区有影响,您可以对 Datum 进行字符串化,如下所示:
var arr = [{ "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 100, "Fehler": 5 }, { "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 5, "Fehler": 1 }, { "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 6, "Fehler": 65 }, { "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "222", "Menge": 10, "Fehler": 5 }, { "Datum": { "date": "2000-01-02 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "444", "Menge": 29, "Fehler": 1 }, { "Datum": { "date": "2000-01-02 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 1, "Fehler": 1 }] var holder = new Map(); arr.forEach(function (d) { const strDatum = JSON.stringify(d.Datum); const current = holder.get(strDatum) || { Menge: 0, Fehler: 0}; holder.set(strDatum, { Menge: current.Menge + d.Menge, Fehler: current.Fehler + d.Fehler }); }); var obj2 = []; holder.forEach((value, key) => { obj2.push({ Datum: JSON.parse(key), Menge: value.Menge, Fehler: value.Fehler, }); }); console.log(obj2);
不使用 JS split() 或 substring()
使用Date()获得您定义的结果。 除了 Udith的答案,我还有一个建议。 你可以做这样的事情:
// This can easily give you the results without even worrying for any substring stuff
const date = new Date(obj.Datum.date)
最终代码:
var dataArray = [{ "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 100, "Fehler": 5 }, { "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 5, "Fehler": 1 }, { "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 6, "Fehler": 65 }, { "Datum": { "date": "2000-01-01 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "222", "Menge": 10, "Fehler": 5 }, { "Datum": { "date": "2000-01-02 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "444", "Menge": 29, "Fehler": 1 }, { "Datum": { "date": "2000-01-02 00:00:00.000000", "timezone_type": 3, "timezone": "Europe/Berlin" }, "Material": "123", "Menge": 1, "Fehler": 1 }]; const holder = {}; dataArray.forEach(obj => { // Using Date() of Javascript for converting the timestamp to a // a date object for better computation const objDate = new Date(obj.Datum.date); if(holder.hasOwnProperty(objDate)){ let existingData = holder[objDate]; holder[objDate] = { Datum: obj.Datum.date, Menge: existingData.Menge + obj.Menge, Fehler: existingData.Fehler + obj.Fehler }; }else{ holder[objDate] = { Datum: obj.Datum.date, Menge: obj.Menge, Fehler: obj.Fehler } } }); const resultObj = Object.values(holder); console.log(resultObj);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.