[英]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.