【问题标题】:Lodash How to double _.grouby a set of data and _.chain() them using double keys?Lodash 如何使用双键将 _.grouby 一组数据和 _.chain() 加倍?
【发布时间】:2020-04-02 01:47:44
【问题描述】:

假设我有这组数据:

"results": [
            {
                "__metadata": {
                    "uri": "https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F19%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D08%2F2020%7CCEMPLOYEE%3DEXT011%7C')",
                    "type": "sapbyd.RPHCMRPMU01_Q1001QueryResult"
                },
                "CCALENDAR_DAY": "/Date(1582070400000)/",
                "CCALENDAR_MONTH": "02/2020",
                "CCALENDAR_WEEK": "08/2020",
                "CEMPLOYEE": "EXT011",
                "KCGROSS_CAPACITY": "8.00000000000000",
                "KCVACATION": "0.00000000000000",
                "UCGROSS_CAPACITY": "HUR",
                "UCVACATION": "HUR"
            },
            {
                "__metadata": {
                    "uri": "https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F20%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D08%2F2020%7CCEMPLOYEE%3DEXT011%7C')",
                    "type": "sapbyd.RPHCMRPMU01_Q1001QueryResult"
                },
                "CCALENDAR_DAY": "/Date(1582156800000)/",
                "CCALENDAR_MONTH": "02/2020",
                "CCALENDAR_WEEK": "08/2020",
                "CEMPLOYEE": "EXT011",
                "KCGROSS_CAPACITY": "8.00000000000000",
                "KCVACATION": "0.00000000000000",
                "UCGROSS_CAPACITY": "HUR",
                "UCVACATION": "HUR"
            },
            {
                "__metadata": {
                    "uri": "https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F21%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D08%2F2020%7CCEMPLOYEE%3DEXT011%7C')",
                    "type": "sapbyd.RPHCMRPMU01_Q1001QueryResult"
                },
                "CCALENDAR_DAY": "/Date(1582243200000)/",
                "CCALENDAR_MONTH": "02/2020",
                "CCALENDAR_WEEK": "08/2020",
                "CEMPLOYEE": "EXT011",
                "KCGROSS_CAPACITY": "8.00000000000000",
                "KCVACATION": "0.00000000000000",
                "UCGROSS_CAPACITY": "HUR",
                "UCVACATION": "HUR"
            },
            {
                "__metadata": {
                    "uri": "https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F24%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D09%2F2020%7CCEMPLOYEE%3DEXT011%7C')",
                    "type": "sapbyd.RPHCMRPMU01_Q1001QueryResult"
                },
                "CCALENDAR_DAY": "/Date(1582502400000)/",
                "CCALENDAR_MONTH": "02/2020",
                "CCALENDAR_WEEK": "09/2020",
                "CEMPLOYEE": "EXT011",
                "KCGROSS_CAPACITY": "8.00000000000000",
                "KCVACATION": "0.00000000000000",
                "UCGROSS_CAPACITY": "HUR",
                "UCVACATION": "HUR"
            },
            {
                "__metadata": {
                    "uri": "https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F25%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D09%2F2020%7CCEMPLOYEE%3DEXT011%7C')",
                    "type": "sapbyd.RPHCMRPMU01_Q1001QueryResult"
                },
                "CCALENDAR_DAY": "/Date(1582588800000)/",
                "CCALENDAR_MONTH": "02/2020",
                "CCALENDAR_WEEK": "09/2020",
                "CEMPLOYEE": "EXT011",
                "KCGROSS_CAPACITY": "8.00000000000000",
                "KCVACATION": "0.00000000000000",
                "UCGROSS_CAPACITY": "HUR",
                "UCVACATION": "HUR"
            }]

我想先按员工 ID CEMPLOYEE 对它们进行分组和链接:

    let e = _.chain(data.d.results)
                    // Group the elements of the result based on `CEMPLOYEE` property
                    .groupBy("CEMPLOYEE")
                    // `key` is group's name (CEMPLOYEE), `value` is the array of objects
                    .map((value, key) => ({
                        Emp: key,
                        Capacity: value
                    })).value();

正如预期的那样,我得到了我想要的第一个输出,如下所示:

Emp: "E1001"
Capacity: (62) [{…}, {…}, {…}, {…}, {…}]
__proto__: Object

现在我被卡住了,我想在我的容量节点内再次做同样的事情,

我想要实现的目标和最终期望的输出如下所示:

Emp: "E1001"
Capacity: (62) [
Week: "09/2020"
CapacityPerWeek: (5) [{…}, {…}, {…}, {…}, {…}

etc...
]
__proto__: Object

所以我尝试了:

    let e = _.chain(data.d.results)
                // Group the elements of the result based on `CEMPLOYEE` property
                .groupBy("CEMPLOYEE")
                // `key` is group's name (CEMPLOYEE), `value` is the array of objects
                .map((value, key) => ({
                    Emp: key,
                    Capacity: value
                })).value();
            _.forEach(e, function (capacityItem) {
                capacityItem.ChainedCapacity = _.chain(capacityItem.Capacity)
                    // Group the elements of the result based on `CCALENDAR_WEEK` property
                    .groupBy("CCALENDAR_WEEK")
                    // `key` is group's name (CCALENDAR_WEEK), `value` is the array of objects
                    .map((value, key) => ({
                        Week: key,
                        CapacityPerWeek: value
                    })).value();
            });

但是它给了我一个癌变的输出,它不必要地循环了我的物品

如何在不循环的情况下实现它?

【问题讨论】:

    标签: javascript arrays sorting grouping lodash


    【解决方案1】:

    不确定lodash,如果您正在寻找vanilla JS。请参考以下代码。

    const data =[{"__metadata":{"uri":"https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F19%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D08%2F2020%7CCEMPLOYEE%3DEXT011%7C')","type":"sapbyd.RPHCMRPMU01_Q1001QueryResult"},"CCALENDAR_DAY":"/Date(1582070400000)/","CCALENDAR_MONTH":"02/2020","CCALENDAR_WEEK":"08/2020","CEMPLOYEE":"EXT011","KCGROSS_CAPACITY":"8.00000000000000","KCVACATION":"0.00000000000000","UCGROSS_CAPACITY":"HUR","UCVACATION":"HUR"},{"__metadata":{"uri":"https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F20%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D08%2F2020%7CCEMPLOYEE%3DEXT011%7C')","type":"sapbyd.RPHCMRPMU01_Q1001QueryResult"},"CCALENDAR_DAY":"/Date(1582156800000)/","CCALENDAR_MONTH":"02/2020","CCALENDAR_WEEK":"08/2020","CEMPLOYEE":"EXT011","KCGROSS_CAPACITY":"8.00000000000000","KCVACATION":"0.00000000000000","UCGROSS_CAPACITY":"HUR","UCVACATION":"HUR"},{"__metadata":{"uri":"https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F21%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D08%2F2020%7CCEMPLOYEE%3DEXT011%7C')","type":"sapbyd.RPHCMRPMU01_Q1001QueryResult"},"CCALENDAR_DAY":"/Date(1582243200000)/","CCALENDAR_MONTH":"02/2020","CCALENDAR_WEEK":"08/2020","CEMPLOYEE":"EXT011","KCGROSS_CAPACITY":"8.00000000000000","KCVACATION":"0.00000000000000","UCGROSS_CAPACITY":"HUR","UCVACATION":"HUR"},{"__metadata":{"uri":"https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F24%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D09%2F2020%7CCEMPLOYEE%3DEXT011%7C')","type":"sapbyd.RPHCMRPMU01_Q1001QueryResult"},"CCALENDAR_DAY":"/Date(1582502400000)/","CCALENDAR_MONTH":"02/2020","CCALENDAR_WEEK":"09/2020","CEMPLOYEE":"EXT011","KCGROSS_CAPACITY":"8.00000000000000","KCVACATION":"0.00000000000000","UCGROSS_CAPACITY":"HUR","UCVACATION":"HUR"},{"__metadata":{"uri":"https://xxxx.sapbydesign.com/sap/byd/odata/ana_businessanalytics_analytics.svc/RPHCMRPMU01_Q1001QueryResults('%7CCCALENDAR_DAY%3D02%2F25%2F2020%7CCCALENDAR_MONTH%3D02%2F2020%7CCCALENDAR_WEEK%3D09%2F2020%7CCEMPLOYEE%3DEXT011%7C')","type":"sapbyd.RPHCMRPMU01_Q1001QueryResult"},"CCALENDAR_DAY":"/Date(1582588800000)/","CCALENDAR_MONTH":"02/2020","CCALENDAR_WEEK":"09/2020","CEMPLOYEE":"EXT011","KCGROSS_CAPACITY":"8.00000000000000","KCVACATION":"0.00000000000000","UCGROSS_CAPACITY":"HUR","UCVACATION":"HUR"}];
    const mapKeys = (obj, fn, en, cp) => {
      const data = obj.reduce((acc, k) => {
        const key = k[fn];
        let item = acc.find(x => x[en] === key);
        if (!item) {
          item = { [en]: key, [cp]: [] };
          acc.push(item);
        }
        item[cp].push(k);
        return acc;
      }, []);
    
      return data;
    };
    
    const funConvert = sample => {
      const data = mapKeys(sample, "CEMPLOYEE", "Emp", "Capacity");
      data.forEach(item => {
        item.Capacity = mapKeys(
          item.Capacity,
          "CCALENDAR_WEEK",
          "Week",
          "CapacityPerWeek"
        );
      });
      return data;
    };
    const emps = funConvert(data);
    console.log(JSON.stringify(emps, null, 4));
    .as-console-row {color: blue!important}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多