繁体   English   中英

如何通过日期 object 的键值对 object 值求和?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM