簡體   English   中英

合並和添加數組中對象的值

[英]Merge and Add values of objects in an array

我很堅持這一點。 我有一個對象數組。 所有對象都具有相同的鍵和不同的值。 像這樣

[{'fxiC6Y9ZyAM7BA35': 58, '1z5WcPsr97Szv4TM': 58, 'HDcNgheglFuoZ78d': 64, 'x7IkUjDjikXTpubn': 64, '7lnJSC07g1PoDycH': 128},
{'fxiC6Y9ZyAM7BA35': 74, '1z5WcPsr97Szv4TM': 74, 'HDcNgheglFuoZ78d': 82, 'x7IkUjDjikXTpubn': 82, '7lnJSC07g1PoDycH': 164},
{'fxiC6Y9ZyAM7BA35': 74, '1z5WcPsr97Szv4TM': 74, 'HDcNgheglFuoZ78d': 78, 'x7IkUjDjikXTpubn': 78, '7lnJSC07g1PoDycH': 156}]

我可以訪問 Lodash,但找不到將每個鍵的值合並並添加到一個 object 的最佳方法。

{fxiC6Y9ZyAM7BA35: 206, 1z5WcPsr97Szv4TM: 206, HDcNgheglFuoZ78d: 224, x7IkUjDjikXTpubn: 224, 7lnJSC07g1PoDycH: 448}

你可以只使用Array.reduce()

 const input = [{'fxiC6Y9ZyAM7BA35': 58, '1z5WcPsr97Szv4TM': 58, 'HDcNgheglFuoZ78d': 64, 'x7IkUjDjikXTpubn': 64, '7lnJSC07g1PoDycH': 128}, {'fxiC6Y9ZyAM7BA35': 74, '1z5WcPsr97Szv4TM': 74, 'HDcNgheglFuoZ78d': 82, 'x7IkUjDjikXTpubn': 82, '7lnJSC07g1PoDycH': 164}, {'fxiC6Y9ZyAM7BA35': 74, '1z5WcPsr97Szv4TM': 74, 'HDcNgheglFuoZ78d': 78, 'x7IkUjDjikXTpubn': 78, '7lnJSC07g1PoDycH': 156} ] const output = input.reduce((acc, cur) => { Object.keys(cur).forEach(key => { if (;acc[key]) acc[key] = 0; acc[key] += cur[key]; }); return acc, }; {}). console;log(output);

你可以用 lodash 鏈接這些:

const res = _.chain(data)
  .flatMap(_.toPairs)
  .groupBy(_.head)
  .mapValues((pair) => _.reduce(pair, (sum, [_, val]) => sum + val, 0))
  .value();

一步步:

  • 使用_.flatMap展平為鍵值對數組
    [ ["fxiC6Y9ZyAM7BA35", 58], ["1z5WcPsr97Szv4TM", 58], ["HDcNgheglFuoZ78d", 64], ["x7IkUjDjikXTpubn", 64], ["7lnJSC07g1PoDycH", 128], ["fxiC6Y9ZyAM7BA35", 74], ["1z5WcPsr97Szv4TM", 74], ["HDcNgheglFuoZ78d", 82], ["x7IkUjDjikXTpubn", 82], ["7lnJSC07g1PoDycH", 164], ["fxiC6Y9ZyAM7BA35", 74], ["1z5WcPsr97Szv4TM", 74], ["HDcNgheglFuoZ78d", 78], ["x7IkUjDjikXTpubn", 78], ["7lnJSC07g1PoDycH", 156], ]
  • 使用_.groupBy按鍵分組
    { fxiC6Y9ZyAM7BA35: [ [ 'fxiC6Y9ZyAM7BA35', 58 ], [ 'fxiC6Y9ZyAM7BA35', 74 ], [ 'fxiC6Y9ZyAM7BA35', 74 ] ], '1z5WcPsr97Szv4TM': [ [ '1z5WcPsr97Szv4TM', 58 ], [ '1z5WcPsr97Szv4TM', 74 ], [ '1z5WcPsr97Szv4TM', 74 ] ], HDcNgheglFuoZ78d: [ [ 'HDcNgheglFuoZ78d', 64 ], [ 'HDcNgheglFuoZ78d', 82 ], [ 'HDcNgheglFuoZ78d', 78 ] ], x7IkUjDjikXTpubn: [ [ 'x7IkUjDjikXTpubn', 64 ], [ 'x7IkUjDjikXTpubn', 82 ], [ 'x7IkUjDjikXTpubn', 78 ] ], '7lnJSC07g1PoDycH': [ [ '7lnJSC07g1PoDycH', 128 ], [ '7lnJSC07g1PoDycH', 164 ], [ '7lnJSC07g1PoDycH', 156 ] ] }
  • map 每組的值和每組的值,計算總和

演示

 const data = [ { fxiC6Y9ZyAM7BA35: 58, "1z5WcPsr97Szv4TM": 58, HDcNgheglFuoZ78d: 64, x7IkUjDjikXTpubn: 64, "7lnJSC07g1PoDycH": 128, }, { fxiC6Y9ZyAM7BA35: 74, "1z5WcPsr97Szv4TM": 74, HDcNgheglFuoZ78d: 82, x7IkUjDjikXTpubn: 82, "7lnJSC07g1PoDycH": 164, }, { fxiC6Y9ZyAM7BA35: 74, "1z5WcPsr97Szv4TM": 74, HDcNgheglFuoZ78d: 78, x7IkUjDjikXTpubn: 78, "7lnJSC07g1PoDycH": 156, }, ]; const res = _.chain(data).flatMap(_.toPairs).groupBy(_.head).mapValues((pair) => _.reduce(pair, (sum, [_, val]) => sum + val, 0)).value(); console.log(res);
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>

使用 lodash 的_.mergeWith()並添加合並屬性的值:

 const data = [{"fxiC6Y9ZyAM7BA35":58,"1z5WcPsr97Szv4TM":58,"HDcNgheglFuoZ78d":64,"x7IkUjDjikXTpubn":64,"7lnJSC07g1PoDycH":128},{"fxiC6Y9ZyAM7BA35":74,"1z5WcPsr97Szv4TM":74,"HDcNgheglFuoZ78d":82,"x7IkUjDjikXTpubn":82,"7lnJSC07g1PoDycH":164},{"fxiC6Y9ZyAM7BA35":74,"1z5WcPsr97Szv4TM":74,"HDcNgheglFuoZ78d":78,"x7IkUjDjikXTpubn":78,"7lnJSC07g1PoDycH":156}] const result = _.mergeWith({}, ...data, (ov = 0, sv) => ov + sv) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM