【问题标题】:How to fill the array of sets by key and sum the values Lodash.js如何按键填充集合数组并对值求和 Lodash.js
【发布时间】:2021-05-05 11:32:48
【问题描述】:

我正在使用 JSLoDash 库。

我从服务器收到的数据如下所示:

const statsToSort = [
{name: "critA", value: 11111},
{name: "critA", value: 11},
{name: "critA", value: 221},
{name: "critA", value: 54},
{name: "critB", value: 1222},
{name: "critC", value: 231},
{name: "critD", value: 323},
{name: "critC", value: 0},
]

我需要重新排列,对相同键的值求和并重新组织。为此,我创建了以下数组:

let finalStats = [{ "critA": 0 }, { "critB": 0 }, { "critC": 0 }, { "CritD": 0 }];

我正在尝试使用 Lodash 库来填充名称的 finalStats 跳跃并对值求和。

我目前的功能是这样的:

function mergeNames(arr) {
    return _.chain(arr).groupBy('name').mapValues(function (v) {
        return _.sum(v);
    })

预期的结果应该是这样的:

/**
statsToSort:[
{name: "critA", value:11397},
{name: "critB", value:1222},
{name: "critC", value:231},
{name: "critD", value:323}, 
*/

到目前为止,我所展示的功能……什么都没有。就像,完全一样。它甚至不按键对数组进行排序。

问题: 你能帮帮我吗

  • 修改函数得到我提到的结果
  • 考虑到名称可能未按字母顺序排列并且 statsToSort 可能不包含要在 finalStats 中填充的一个或几个名称,可能会向函数添加另一层,以便填充 finalStats 数组。李>

提前致谢

【问题讨论】:

  • 请说明您拥有什么以及您想获得什么。我还不清楚...
  • @NinaScholz 我稍微修改了一个问题。是不是更清楚了?

标签: javascript arrays lodash


【解决方案1】:

您可以获取地图并获取总和值。

const
    statsToSort = [{ name: "critA", value: 11111 }, { name: "critA", value: 11 }, { name: "critA", value: 221 }, { name: "critA", value: 54 }, { name: "critB", value: 1222 }, { name: "critC", value: 231 }, { name: "critD", value: 323 }, { name: "critC", value: 0 }],
    result = Array
        .from(
            statsToSort.reduce((m, { name, value }) => m.set(name, (m.get(name) || 0) + value), new Map),
            ([name, value]) => ({ name, value })
        )
        .sort((a, b) => a.name.localeCompare(b.name));

console.log(result);

【讨论】:

  • OP 已经在使用 lodash,无需复制其功能。
  • 感谢您的贡献!这确实符合要求,但作为规范,我特别在寻找下划线库解决方案(我提到过)。我一定会为其他项目保留您的解决方案!干杯!
【解决方案2】:

这似乎可以满足您的需求:

const statsToSort = [
    {name: "critA", value: 11111},
    {name: "critA", value: 11},
    {name: "critA", value: 221},
    {name: "critA", value: 54},
    {name: "critB", value: 1222},
    {name: "critC", value: 231},
    {name: "critD", value: 323},
    {name: "critC", value: 0},
]

let mergeNames = arr => _(arr)
    .groupBy('name')
    .mapValues(vals => ({
        name: vals[0].name,
        value: _.sumBy(vals, 'value')
    }))
    .value()

let finalStats = mergeNames(statsToSort)
console.log(finalStats)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

【讨论】:

  • 谢谢!这正是我想要的!我想我会自己找到一种交叉填充最终地图的方法,但这一步对我来说已经很重要了。干杯!
猜你喜欢
  • 2018-06-29
  • 2011-10-29
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2010-11-27
  • 2015-12-13
相关资源
最近更新 更多