1

How can I merge multiple dictionaries while summing the values against each key if common?

Dict01

{  Name1: { '#00b050': 10, '#efefef': 10 },
   Name2: { '#00b050': 10, '#efefef': 10 },
   Name3: { '#00b050': 10, '#efefef': 10 },
   Name4: { '#00b050': 10, '#efefef': 10 },
   Name5: { '#00b050': 10, '#efefef': 10 },
   Name6: { '#00b050': 10, '#efefef': 10 },
   Name7: { '#efefef': 3 } }

Dict02

{ Name1: { '#00b050': 10, '#efefef': 10 },
  Name2: { '#00b050': 10, '#efefef': 10 },
  Name3: { '#00b050': 10, '#efefef': 10 },
  Name4: { '#00b050': 10, '#efefef': 10 },
  Name5: { '#00b050': 10, '#efefef': 10, '#00ff00': 3 },
  Name6: { '#00b050': 10, '#efefef': 10 },
  Name7: { '#efefef': 3 } }

Dict03

{ Name1: { '#b7b7b7': 10, '#efefef': 10, '#00b050': 10 },
  Name2: { '#b7b7b7': 10, '#efefef': 10 },
  Name3: { '#efefef': 10, '#b7b7b7': 10 },
  Name4: { '#efefef': 10, '#b7b7b7': 10 },
  Name5: { '#b7b7b7': 10, '#efefef': 10, '#00b050': 10, '#00ff00': 3 },
  Name6: { '#b7b7b7': 10, '#efefef': 10 },
  Name7: { '#efefef': 3 } }

Result

{ Name1: { '#00b050': 30, '#efefef': 30, '##b7b7b7': 10 },
  Name2: { '#00b050': 20, '#efefef': 30, '##b7b7b7': 10 },
  Name3: { '#00b050': 20, '#efefef': 30, '##b7b7b7': 10 },
  Name4: { '#00b050': 20, '#efefef': 30, '##b7b7b7': 10 },
  Name5: { '#00b050': 30, '#efefef': 30, '##b7b7b7': 10, '#00ff00': 3 },
  Name6: { '#00b050': 20, '#efefef': 30, '##b7b7b7': 10 },
  Name7: { '#efefef': 9 } }

I tried the following (Merge and sum of two dictionaries) but struggling to iterate

const obj = { i : Dict01.get(i,0) + Dict02.get(i,0) + Dict03.get(i,0) for i in set(Dict01) | set(Dict02) | set(Dict03)}
RF919
  • 47
  • 4

1 Answers1

2

You want to retrieve your expected result from the sample values using Google Apps Script. In your situation, how about the following sample script?

Sample script:

const dict01 = {
  Name1: { '#00b050': 10, '#efefef': 10 },
  Name2: { '#00b050': 10, '#efefef': 10 },
  Name3: { '#00b050': 10, '#efefef': 10 },
  Name4: { '#00b050': 10, '#efefef': 10 },
  Name5: { '#00b050': 10, '#efefef': 10 },
  Name6: { '#00b050': 10, '#efefef': 10 },
  Name7: { '#efefef': 3 }
};
const dict02 = {
  Name1: { '#00b050': 10, '#efefef': 10 },
  Name2: { '#00b050': 10, '#efefef': 10 },
  Name3: { '#00b050': 10, '#efefef': 10 },
  Name4: { '#00b050': 10, '#efefef': 10 },
  Name5: { '#00b050': 10, '#efefef': 10, '#00ff00': 3 },
  Name6: { '#00b050': 10, '#efefef': 10 },
  Name7: { '#efefef': 3 }
};
const dict03 = {
  Name1: { '#b7b7b7': 10, '#efefef': 10, '#00b050': 10 },
  Name2: { '#b7b7b7': 10, '#efefef': 10 },
  Name3: { '#efefef': 10, '#b7b7b7': 10 },
  Name4: { '#efefef': 10, '#b7b7b7': 10 },
  Name5: { '#b7b7b7': 10, '#efefef': 10, '#00b050': 10, '#00ff00': 3 },
  Name6: { '#b7b7b7': 10, '#efefef': 10 },
  Name7: { '#efefef': 3 }
};

const temp = [dict01, dict02, dict03]
  .flatMap(o => Object.entries(o).map(([k, v]) => [k, Object.entries(v)]))
  .reduce((o, [k, v]) => (o[k] = o[k] ? [...o[k], ...v] : v, o), {});
const res = Object.entries(temp).reduce((o, [k, v]) => (o[k] = v.reduce((oo, [kk, vv]) => (oo[kk] = oo[kk] ? oo[kk] + vv : vv, oo), {}), o), {});
console.log(res);

Testing:

When this script is run, the following result is obtained.

{
  "Name1":{"#00b050":30,"#efefef":30,"#b7b7b7":10},
  "Name2":{"#00b050":20,"#efefef":30,"#b7b7b7":10},
  "Name3":{"#00b050":20,"#efefef":30,"#b7b7b7":10},
  "Name4":{"#00b050":20,"#efefef":30,"#b7b7b7":10},
  "Name5":{"#00b050":30,"#efefef":30,"#00ff00":6,"#b7b7b7":10},
  "Name6":{"#00b050":20,"#efefef":30,"#b7b7b7":10},
  "Name7":{"#efefef":9}
}

Note:

  • In your sample results, #b7b7b7 becomes ##b7b7b7. I guessed that this might be your miscopied.

References:

Tanaike
  • 181,128
  • 11
  • 97
  • 165