【问题标题】:lodash groupby and sum object propertieslodash groupby 和 sum 对象属性
【发布时间】:2020-08-28 12:27:42
【问题描述】:

我有一个对象数组,我需要根据一个属性对其进行缩减并对另一个属性求和。 This solution is pretty much what I'm after,但我需要避免使用_.chain,因为我只导入特定的模块。

我尝试过使用 flow,但没有得到任何值:

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 }
]

理想情况下,我想在原版 es6 中执行此操作,我已经尝试过了,但不确定如何计算总和。

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

【问题讨论】:

  • @Ruben 的 ES6 解决方案是我解决这个问题的首选方法。但出于好奇,谁能回答我在 lodash 流中做错了什么?当我使用chain方法时,我得到了正确的结果

标签: javascript lodash


【解决方案1】:

下面这个仅限 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);

【讨论】:

    【解决方案2】:

    您可以使用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>

    【讨论】:

      【解决方案3】:

      这可以被认为是一个 less efficient,但更易于阅读 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))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多