簡體   English   中英

lodash groupby 和 sum 對象屬性

[英]lodash groupby and sum object properties

我有一個對象數組,我需要根據一個屬性減少它們並對另一個屬性求和。 這個解決方案幾乎是我所追求的,但我需要避免使用_.chain作為只導入特定模塊。

我試過使用流,但沒有得到任何值:

const sumBy = require('lodash/fp/sumBy');
const flow = require('lodash/fp/flow');
const groupBy = require('lodash/fp/groupBy');
const map = require('lodash/fp/map');

const list = [
    { property: 'foo', value: 1 },
    { property: 'foo', value: 3 },
    { property: 'bar', value: 2 },
    { property: 'bar', value: 3 },
    { property: 'chu', value: 8 },
];

const foo = flow(
  groupBy('property'),
  map((objs, key) => {
    return {
      property: key,
      value: sumBy(objs, 'value')
    }
  })
)(list)

這返回

[
    { property: undefined, value: 0 },
    { property: undefined, value: 0 },
    { property: undefined, value: 0 }
]

理想情況下,我想在 vanilla es6 中執行此操作,我已經嘗試過了,但不確定如何計算總和。

const bar = list.reduce((o, v) => {
    return {...o, [v.property]: v.value}
}, {})

以下僅 ES6 的解決方案如何:

 const list = [ { property: 'foo', value: 1 }, { property: 'foo', value: 3 }, { property: 'bar', value: 2 }, { property: 'bar', value: 3 }, { property: 'chu', value: 8 }, ]; const result = list.reduce((obj, el) => { obj[el.property] = (obj[el.property] || 0) + el.value; return obj; }, {}); console.log(result);

你可以拿一張Map

 const list = [{ property: 'foo', value: 1 }, { property: 'foo', value: 3 }, { property: 'bar', value: 2 }, { property: 'bar', value: 3 }, { property: 'chu', value: 8 }], result = Array.from( list.reduce((m, { property, value }) => m.set(property, (m.get(property) || 0) + value), new Map), (([property, value]) => ({ property, value })) ); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

用 lodash

 const list = [{ property: 'foo', value: 1 }, { property: 'foo', value: 3 }, { property: 'bar', value: 2 }, { property: 'bar', value: 3 }, { property: 'chu', value: 8 }], result = _(list) .groupBy('property') .map((array, property) => ({ property, value: _.sumBy(array, 'value')})) ; console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

這可以被認為是 Ruben Helsloot 答案的一種效率較低但更易於閱讀的變體。

 const sumValues = list => list .reduce ((obj, {property, value}) => ({ ... obj, [property]: (obj [property] || 0) + value }), {}) const list = [{property: 'foo', value: 1}, {property: 'foo', value: 3}, {property: 'bar', value: 2}, {property: 'bar', value: 3}, {property: 'chu', value: 8}] console .log (sumValues (list))

暫無
暫無

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

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