首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过键填充集合数组并对值Lodash.js进行求和

如何通过键填充集合数组并对值Lodash.js进行求和
EN

Stack Overflow用户
提问于 2021-05-05 11:32:48
回答 2查看 89关注 0票数 0

我正在使用JSLoDash库。

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

代码语言:javascript
复制
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},
]

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

代码语言:javascript
复制
let finalStats = [{ "critA": 0 }, { "critB": 0 }, { "critC": 0 }, { "CritD": 0 }];

我试图使用Lodash库来填充名称的finalStats跳转,并对值进行求和。

到目前为止,我的功能如下:

代码语言:javascript
复制
function mergeNames(arr) {
    return _.chain(arr).groupBy('name').mapValues(function (v) {
        return _.sum(v);
    })

预期的结果应该是这样:

代码语言:javascript
复制
/**
statsToSort:[
{name: "critA", value:11397},
{name: "critB", value:1222},
{name: "critC", value:231},
{name: "critD", value:323}, 
*/

到目前为止,我展示的函数是...Nothing。就像,一点也不。它甚至不按键对数组进行排序。

问:你能帮我吗?

mentioned

  • maybe修改函数以获得结果i

  • 向函数添加另一层,以便它可以填充finalStats数组,考虑到名称可能不是按字母顺序排列的,statsToSort可能不包含要在finalStats.

中填充的一个或几个名称。

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-05 12:10:03

这看起来像你想要的那样:

代码语言:javascript
复制
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)
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

票数 0
EN

Stack Overflow用户

发布于 2021-05-05 12:08:50

你可以拿一张地图,得到求和值。

代码语言:javascript
复制
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);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67400455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档