const sum = (ns) => ns.reduce((a, b) => a + b, 0) const disp = (x) => Math.round(10000 * x) / 100 const report = (pops, dcPop, ...sizes) => { const totalPop = sum ([dcPop, ...Object .values (pops)]) const data = sizes .reduce ( (a, s) => { const totalElectors = sum(Object.values(electors (s, pops))) return Object.entries (electors (s, pops)) .reduce((a, [state, e]) => ({ ...a, [state]: {...a[state], [s + ' #']: e, [s + ' %']: e / totalElectors} }), a) }, Object .fromEntries (Object .entries (pops) .map(([s, p]) => [s, {population: p, 'pop %': p / totalPop}])) ) console.log( `| State | Population | Pop % | ` + sizes.map(s => `${s} # | ${s} % `).join(' | ') + ' |' ) console.log( `|-------|------------|-------|` + sizes.map(s => `-------|-------`).join('|') + ' |' ) Object .keys (data) .sort().forEach(state => { const e = data [state] console.log( `| ${state} | ${e.population} | ${disp(e['pop %'])} | ` + sizes.map(s => `${e[s + ' #']} | ${disp(e[s + ' %'])} `).join(' | ') + ' |' ) }) return data } // from https://api.census.gov/data/2019/pep/population?get=POP,NAME&for=state:* -- removing DC & PR const pops = {Alabama: 4903185, Alaska: 731545, Arizona: 7278717, Arkansas: 3017804, California: 39512223, Colorado: 5758736, Connecticut: 3565287, Delaware: 973764, 'District of Columbia': 705749, Florida: 21477737, Georgia: 10617423, Hawaii: 1415872, Idaho: 1787065, Illinois: 12671821, Indiana: 6732219, Iowa: 3155070, Kansas: 2913314, Kentucky: 4467673, Louisiana: 4648794, Maine: 1344212, Maryland: 6045680, Massachusetts: 6892503, Michigan: 9986857, Minnesota: 5639632, Mississippi: 2976149, Missouri: 6137428, Montana: 1068778, Nebraska: 1934408, Nevada: 3080156, 'New Hampshire': 1359711, 'New Jersey': 8882190, 'New Mexico': 2096829, 'New York': 19453561, 'North Carolina': 10488084, 'North Dakota': 762062, Ohio: 11689100, Oklahoma: 3956971, Oregon: 4217737, Pennsylvania: 12801989, 'Rhode Island': 1059361, 'South Carolina': 5148714, 'South Dakota': 884659, Tennessee: 6829174, Texas: 28995881, Utah: 3205958, Vermont: 623989, Virginia: 8535519, Washington: 7614893, 'West Virginia': 1792147, Wisconsin: 5822434, Wyoming: 578759} const dcPop = 705749 // same source, simply needs different handling. report(pops, dcPop, 435, 1000, 5000)