【发布时间】:2022-01-22 03:22:54
【问题描述】:
我有数据数组
还有这样的减少:
const productMapData = [{
"occurredAt": "2021-09-20T00:00:00.000",
"soldTickets": 3836,
"soldRevenue": 70762,
"playedOffTickets": 2068,
"playedOffRevenue": 41429.5,
"changeInPeriodTickets": 1768,
"changeInPeriodRevenue": 29332.5,
"eopAdvanceTickets": 1768,
"eopAdvanceRevenue": 29332.5,
"advanceTickets": 1500,
"advanceRevenue": 11521
},
{
"occurredAt": "2021-09-27T00:00:00.000",
"soldTickets": 4708,
"soldRevenue": 88647.5,
"playedOffTickets": 2127,
"playedOffRevenue": 49526.5,
"changeInPeriodTickets": 2581,
"changeInPeriodRevenue": 39121,
"eopAdvanceTickets": 2581,
"eopAdvanceRevenue": 39121,
"advanceTickets": 700,
"advanceRevenue": 9521
},
{
"occurredAt": "2021-10-04T00:00:00.000",
"soldTickets": 5514,
"soldRevenue": 93969.5,
"playedOffTickets": 988,
"playedOffRevenue": 9983,
"changeInPeriodTickets": 4526,
"changeInPeriodRevenue": 83986.5,
"eopAdvanceTickets": 4526,
"eopAdvanceRevenue": 83986.5,
"advanceTickets": 1730,
"advanceRevenue": 14650
},
{
"occurredAt": "2021-10-11T00:00:00.000",
"soldTickets": 7598,
"soldRevenue": 109059.5,
"playedOffTickets": 1476,
"playedOffRevenue": 16474.5,
"changeInPeriodTickets": 6122,
"changeInPeriodRevenue": 92585,
"eopAdvanceTickets": 6122,
"eopAdvanceRevenue": 92585,
"advanceTickets": 800,
"advanceRevenue": 7560
},
];
const mapWaterfallChartData = () => productMapData.reduce((previous, point) => {
const names = ['sopAdvance', 'playedOff', 'sales', 'eopAdvance'];
const name = names.map(name => name);
previous[name] = previous[name] || {
data: [],
total: 0
};
const sopAdvance = point.advanceTickets;
const playedOff = point.playedOffTickets;
const sales = point.soldTickets;
const eopAdvance = point.eopAdvanceTickets;
return previous;
}, {});
console.log(mapWaterfallChartData(productMapData))
我想要实现的是创建具有name 和y 值的新对象,其中名称将是名称数组中的值,y 将是属于该名称的值。像这样的:
[
{
name: 'sopAdvance',
y: 4730
},
{
name: 'playedOff',
y: 6659
},
{
name: 'sales',
y: 21656
},
{
name: 'eopAdvance',
y: 14997
}
]
我对如何做到这一点感到困惑和困惑,因此我们将不胜感激。
【问题讨论】:
-
部分问题是您在没有充分理由的情况下陷入了使用
reduce的陷阱,这可能是您遇到的主要问题。我猜你收到错误“无法设置undefined的属性。那是因为你永远不会从reduce回调中返回previous,等等下一次通过previous是undefined.相反,只是使用一个简单的循环。(reduce非常适合使用预定义的、可重用的 reducer 函数进行函数式编程。如果不是,那只是编写循环的一种复杂且容易出错的方法。) -
const name = names.map(name => name); previous[name] = previous[name] || ...-name是names的副本,因此它也是一个所有名称的数组o.O -
结果应该是什么?我不能从代码中完全分辨出来。
-
@T.J.Crowder 按“名称”(及其各自的属性)分组并将它们的值相加
-
@mplungjan 很好,我从你的第一个答案中得到了它,这就是我需要的。谢谢!
标签: javascript ecmascript-6 reduce