Search code examples
javascriptangularlodashtypescript

groupBy Nested Object with array using lodash


I have a JSON Object as show below.

response = [{
"Myanmar": [{
    "EDCBA0000013620": {
        "mou": 0.0,
        "CA": 1.0,
        "CCS": 0.0,
        "COC": 0.0
    }
}],
"Gibraltar": [{
    "ABCDE0000013643": {
        "mou": 12.850000381469727,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 3.0
    }
}],
"Cyprus": [{
    "ABCDE0000010121": {
        "mou": 36.25,
        "CA": 3.0,
        "CCS": 2.0,
        "COC": 7.0
    },
    "ABCDE0000013643": {
        "mou": 27.299999237060547,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 6.0
    },
    "ABCDE0000013662": {
        "mou": 80.59999752044678,
        "CA": 4.0,
        "CCS": 4.0,
        "COC": 14.0
    },
    "ABCDE0000010328": {
        "mou": 26.716670513153076,
        "CA": 4.0,
        "CCS": 4.0,
        "COC": 6.0
    }
}],
"Kazakhstan": [{
    "EDCBA0000013620": {
        "mou": 0.0,
        "CA": 32.0,
        "CCS": 0.0,
        "COC": 0.0
    },
    "ABCDE0000013643": {
        "mou": 17.0,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 3.0
    },
    "ABCDE0000010121": {
        "mou": 15.783329963684082,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 4.0
    },
    "EDCBA0000015450": {
        "mou": 11.683329582214355,
        "CA": 23.0,
        "CCS": 1.0,
        "COC": 3.0
    },
    "ABCDE0000010328": {
        "mou": 0.0,
        "CA": 0.0,
        "CCS": 0.0,
        "COC": 4.0
    },
    "EDCBA0000015451": {
        "mou": 11.316670417785645,
        "CA": 29.0,
        "CCS": 1.0,
        "COC": 2.0
    },
    "EDCBA0000010541": {
        "mou": 17.316669464111328,
        "CA": 30.0,
        "CCS": 1.0,
        "COC": 3.0
    }
}],
"Portugal": [{
    "ABCDE0000013643": {
        "mou": 352.2333300113678,
        "CA": 30.0,
        "CCS": 30.0,
        "COC": 67.0
    },
    "ABCDE0000010121": {
        "mou": 342.4499905705452,
        "CA": 25.0,
        "CCS": 24.0,
        "COC": 65.0
    },
    "EDCBA0000013620": {
        "mou": 85.1666567698121,
        "CA": 3.0,
        "CCS": 3.0,
        "COC": 19.0
    },
    "ABCDE0000013662": {
        "mou": 478.6499952673912,
        "CA": 26.0,
        "CCS": 26.0,
        "COC": 92.0
    },
    "ABCDE0000010328": {
        "mou": 347.5833450257778,
        "CA": 25.0,
        "CCS": 25.0,
        "COC": 57.0
    },
    "EDCBA0000015450": {
        "mou": 15.883330345153809,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 4.0
    },
    "EDCBA0000055797": {
        "mou": 31.799999237060547,
        "CA": 2.0,
        "CCS": 2.0,
        "COC": 4.0
    },
    "EDCBA0000015451": {
        "mou": 9.150000035762787,
        "CA": 3.0,
        "CCS": 2.0,
        "COC": 1.0
    },
    "EDCBA0000010541": {
        "mou": 57.78332122415304,
        "CA": 8.0,
        "CCS": 5.0,
        "COC": 11.0
    }
}],
"Iceland": [{
    "ABCDE0000013662": {
        "mou": 1.783329963684082,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 0.0
    }
}]

}]

what i want to achieve is group every country data based on the substring of keys inside every-country array.

Expected JSON:

"Cyprus": [
"ABCDE": {
    "ABCDE0000010121": {
        "mou": 36.25,
        "CA": 3.0,
        "CCS": 2.0,
        "COC": 7.0
    },
    "ABCDE0000013643": {
        "mou": 27.299999237060547,
        "CA": 1.0,
        "CCS": 1.0,
        "COC": 6.0
    }
},
"EDCBA": {
    "EDCBA0000013662": {
        "mou": 80.59999752044678,
        "CA": 4.0,
        "CCS": 4.0,
        "COC": 14.0
    },
    "EDCBA0000010328": {
        "mou": 26.716670513153076,
        "CA": 4.0,
        "CCS": 4.0,
        "COC": 6.0
    }
}

] i tried achieving this using loadash, but didnot succeed.

below is the function i have written using loadash.

res=[
            {
                "Myanmar": [
                    {
                        "EDCBA0000013620": {
                            "mou": 0.0,
                            "CA": 1.0,
                            "CCS": 0.0,
                            "COC": 0.0
                        }
                    }
                ],
                "Gibraltar": [
                    {
                        "ABCDE0000013643": {
                            "mou": 12.850000381469727,
                            "CA": 1.0,
                            "CCS": 1.0,
                            "COC": 3.0
                        }
                    }
                ],
                "Cyprus": [
                    {
                        "ABCDE0000010121": {
                            "mou": 36.25,
                            "CA": 3.0,
                            "CCS": 2.0,
                            "COC": 7.0
                        },
                        "ABCDE0000013643": {
                            "mou": 27.299999237060547,
                            "CA": 1.0,
                            "CCS": 1.0,
                            "COC": 6.0
                        },
                        "ABCDE0000013662": {
                            "mou": 80.59999752044678,
                            "CA": 4.0,
                            "CCS": 4.0,
                            "COC": 14.0
                        },
                        "ABCDE0000010328": {
                            "mou": 26.716670513153076,
                            "CA": 4.0,
                            "CCS": 4.0,
                            "COC": 6.0
                        }
                    }
                ],
                "Kazakhstan": [
                    {
                        "EDCBA0000013620": {
                            "mou": 0.0,
                            "CA": 32.0,
                            "CCS": 0.0,
                            "COC": 0.0
                        },
                        "ABCDE0000013643": {
                            "mou": 17.0,
                            "CA": 1.0,
                            "CCS": 1.0,
                            "COC": 3.0
                        },
                        "ABCDE0000010121": {
                            "mou": 15.783329963684082,
                            "CA": 1.0,
                            "CCS": 1.0,
                            "COC": 4.0
                        },
                        "EDCBA0000015450": {
                            "mou": 11.683329582214355,
                            "CA": 23.0,
                            "CCS": 1.0,
                            "COC": 3.0
                        },
                        "ABCDE0000010328": {
                            "mou": 0.0,
                            "CA": 0.0,
                            "CCS": 0.0,
                            "COC": 4.0
                        },
                        "EDCBA0000015451": {
                            "mou": 11.316670417785645,
                            "CA": 29.0,
                            "CCS": 1.0,
                            "COC": 2.0
                        },
                        "EDCBA0000010541": {
                            "mou": 17.316669464111328,
                            "CA": 30.0,
                            "CCS": 1.0,
                            "COC": 3.0
                        }
                    }
                ],
                "Portugal": [
                    {
                        "ABCDE0000013643": {
                            "mou": 352.2333300113678,
                            "CA": 30.0,
                            "CCS": 30.0,
                            "COC": 67.0
                        },
                        "ABCDE0000010121": {
                            "mou": 342.4499905705452,
                            "CA": 25.0,
                            "CCS": 24.0,
                            "COC": 65.0
                        },
                        "EDCBA0000013620": {
                            "mou": 85.1666567698121,
                            "CA": 3.0,
                            "CCS": 3.0,
                            "COC": 19.0
                        },
                        "ABCDE0000013662": {
                            "mou": 478.6499952673912,
                            "CA": 26.0,
                            "CCS": 26.0,
                            "COC": 92.0
                        },
                        "ABCDE0000010328": {
                            "mou": 347.5833450257778,
                            "CA": 25.0,
                            "CCS": 25.0,
                            "COC": 57.0
                        },
                        "EDCBA0000015450": {
                            "mou": 15.883330345153809,
                            "CA": 1.0,
                            "CCS": 1.0,
                            "COC": 4.0
                        },
                        "EDCBA0000055797": {
                            "mou": 31.799999237060547,
                            "CA": 2.0,
                            "CCS": 2.0,
                            "COC": 4.0
                        },
                        "EDCBA0000015451": {
                            "mou": 9.150000035762787,
                            "CA": 3.0,
                            "CCS": 2.0,
                            "COC": 1.0
                        },
                        "EDCBA0000010541": {
                            "mou": 57.78332122415304,
                            "CA": 8.0,
                            "CCS": 5.0,
                            "COC": 11.0
                        }
                    }
                ],
                "Iceland": [
                    {
                        "ABCDE0000013662": {
                            "mou": 1.783329963684082,
                            "CA": 1.0,
                            "CCS": 1.0,
                            "COC": 0.0
                        }
                    }
                ]
				}
		]


var result = _.map(_.flatMap(res));
    // console.log(result,"result");
    for (let [key, value] of Object.entries(result[0])){
      for(let[ikey,ivalue]of Object.entries(value)){
        for(let[valueKey,valueArr] of Object.entries(ivalue)){
          // console.log(valueKey,valueArr);
          valueArr.trunkId = valueKey
          valueArr[name] = key;
        this.groupedData.push(valueArr);
        } 
      }
    }
   let result1 =  _.chain(this.groupedData)
    .groupBy("previewFrame")
    .map((value, key) => ({ country: key, trunks: value }))
    .value()
    console.log(JSON.stringify(result1))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

I am able to group the data for one level, but in lodash how to group the array inside a Object using a substring of key. I am stuck here, Please help. Thanks in Advance


Solution

  • You could map the entries and build a new grouping level for the countries.

    var data = [{ Myanmar: [{ EDCBA0000013620: { mou: 0, CA: 1, CCS: 0, COC: 0 } }], Gibraltar: [{ ABCDE0000013643: { mou: 12.850000381469727, CA: 1, CCS: 1, COC: 3 } }], Cyprus: [{ ABCDE0000010121: { mou: 36.25, CA: 3, CCS: 2, COC: 7 }, ABCDE0000013643: { mou: 27.299999237060547, CA: 1, CCS: 1, COC: 6 }, ABCDE0000013662: { mou: 80.59999752044678, CA: 4, CCS: 4, COC: 14 }, ABCDE0000010328: { mou: 26.716670513153076, CA: 4, CCS: 4, COC: 6 } }], Kazakhstan: [{ EDCBA0000013620: { mou: 0, CA: 32, CCS: 0, COC: 0 }, ABCDE0000013643: { mou: 17, CA: 1, CCS: 1, COC: 3 }, ABCDE0000010121: { mou: 15.783329963684082, CA: 1, CCS: 1, COC: 4 }, EDCBA0000015450: { mou: 11.683329582214355, CA: 23, CCS: 1, COC: 3 }, ABCDE0000010328: { mou: 0, CA: 0, CCS: 0, COC: 4 }, EDCBA0000015451: { mou: 11.316670417785645, CA: 29, CCS: 1, COC: 2 }, EDCBA0000010541: { mou: 17.316669464111328, CA: 30, CCS: 1, COC: 3 } }], Portugal: [{ ABCDE0000013643: { mou: 352.2333300113678, CA: 30, CCS: 30, COC: 67 }, ABCDE0000010121: { mou: 342.4499905705452, CA: 25, CCS: 24, COC: 65 }, EDCBA0000013620: { mou: 85.1666567698121, CA: 3, CCS: 3, COC: 19 }, ABCDE0000013662: { mou: 478.6499952673912, CA: 26, CCS: 26, COC: 92 }, ABCDE0000010328: { mou: 347.5833450257778, CA: 25, CCS: 25, COC: 57 }, EDCBA0000015450: { mou: 15.883330345153809, CA: 1, CCS: 1, COC: 4 }, EDCBA0000055797: { mou: 31.799999237060547, CA: 2, CCS: 2, COC: 4 }, EDCBA0000015451: { mou: 9.150000035762787, CA: 3, CCS: 2, COC: 1 }, EDCBA0000010541: { mou: 57.78332122415304, CA: 8, CCS: 5, COC: 11 } }], Iceland: [{ ABCDE0000013662: { mou: 1.783329963684082, CA: 1, CCS: 1, COC: 0 } }] }],
        result = data.map(o => Object.fromEntries(Object.entries(o).map(([k, v]) => [
            k,
            v.map(o => Object.entries(o).reduce((r, [l, w]) => {
                const key = l.slice(0, 5);
                r[key] = r[key] || {};
                r[key][l] = w;
                return r;
            }, {}))
        ])));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }