如何按键填充集合数组并对值求和 Lodash.js
How to fill the array of sets by key and sum the values Lodash.js
我正在使用 JS 和 LoDash 库。
我从服务器收到的数据如下所示:
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 数组。
提前致谢
您可以拍一张地图并获得总值。
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);
这似乎符合您的要求:
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>
我正在使用 JS 和 LoDash 库。
我从服务器收到的数据如下所示:
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 数组。
提前致谢
您可以拍一张地图并获得总值。
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);
这似乎符合您的要求:
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>