用Javascript聚合这些数据的更实用或更简洁的方法?
我的数据集如下所示:用Javascript聚合这些数据的更实用或更简洁的方法?,javascript,Javascript,我的数据集如下所示: dataPoints = [ { "x": 1, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12}, { "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing&qu
dataPoints = [
{ "x": 1, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
...
]
期望输出:
[
{ "x": 1, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 40, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 30, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
]
我写这篇文章基本上是为了做我想做的事。我要做的是,对于所有具有相同x的数据点,将y的值相加,并从中生成一个数据点。在本用例中,我们可以假设其他字段将相等,或者假设它们是否不同并不重要,我们可以只取其中一个数据点的值:
let aggregatedDataPoints = new Map();
for (let dataPoint of dataPoints) {
if (aggregatedDataPoints.has(dataPoint.key.toString())) {
let prevPoint = aggregatedDataPoints.get(dataPoint.key.toString());
let newPoint = {...prevPoint};
newPoint.y = prevPoint.y + dataPoint.y;
aggregatedDataPoints.set(dataPoint.key.toString(), newPoint);
} else {
aggregatedDataPoints.set(dataPoint.key.toString(), dataPoint);
}
}
return aggregatedDataPoints;
然而,我对这个解决方案并不满意,因为它看起来有点凌乱。我试着看看我是否可以使用一种更实用或简洁的方法来做同样的事情,但是我很难让任何更优雅的方法工作
任何帮助都将不胜感激 您可以使用。减少:
数据点=[
{x:1234,y:14,其他一些未更新的内容:15,其他一些内容:12},
{x:1235},
{x:1234,y:34,其他一些未更新的内容:15,其他一些内容:12},
].reducecarry,当前=>{
const existing=carry.findel=>el.x==current.x;
如果!现有进位电流;
否则,如果存在.y&¤t.y现有.y+=current.y;
返运;
}, []
console.logdataPoints 您可以使用。减少:
数据点=[
{x:1234,y:14,其他一些未更新的内容:15,其他一些内容:12},
{x:1235},
{x:1234,y:34,其他一些未更新的内容:15,其他一些内容:12},
].reducecarry,当前=>{
const existing=carry.findel=>el.x==current.x;
如果!现有进位电流;
否则,如果存在.y&¤t.y现有.y+=current.y;
返运;
}, []
console.logdataPoints 如果只需要[x,y]对,则可以使用对象映射这些值: 设dataPoints=[ {x:1234,y:14,其他一些未更新的内容:15,其他一些内容:12}, {x:1235,}, {x:1234,y:34,其他一些未更新的内容:15,其他一些内容:12}, ]; 设res={}; dataPoints.forEachel=>res[el.x]=+el.y+res[el.y]|0
console.logres 如果只需要[x,y]对,则可以使用对象映射这些值: 设dataPoints=[ {x:1234,y:14,其他一些未更新的内容:15,其他一些内容:12}, {x:1235,}, {x:1234,y:34,其他一些未更新的内容:15,其他一些内容:12}, ]; 设res={}; dataPoints.forEachel=>res[el.x]=+el.y+res[el.y]|0
console.logres 更惯用的方法可能如下所示:
dataPoints = [
{ "x": 1, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
...
]
const result={};
dataPoints.forEach{x,y:currentY,…other}=>{
常数y=当前y+结果[x]?.y | | 0
结果[x]={…其他,x,y}
}
或者,如果您不喜欢变异属性:
对象值
dataPoints.reduceresult,{x,y:currentY,…other}=>{
常数y=当前y+结果[x]?.y | | 0
返回{
后果
[x] :{……其他,x,y}
}
}, {}
更惯用的方法可能如下所示:
dataPoints = [
{ "x": 1, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 2, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 10, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
{ "x": 3, "y": 20, "someOtherUnrelatedThing": 15, "someOtherThing": 12},
...
]
const result={};
dataPoints.forEach{x,y:currentY,…other}=>{
常数y=当前y+结果[x]?.y | | 0
结果[x]={…其他,x,y}
}
或者,如果您不喜欢变异属性:
对象值
dataPoints.reduceresult,{x,y:currentY,…other}=>{
常数y=当前y+结果[x]?.y | | 0
返回{
后果
[x] :{……其他,x,y}
}
}, {}
您能发布所需的输出吗?@Berto99完成,谢谢。我投票结束这个问题,因为它似乎是codereview.stackexchange.com的更好的候选人。@DanO。从现在起,评估问题并使用以下理由:;需要重点关注,主要是基于意见等。您能发布所需的输出吗?@Berto99完成,谢谢。我投票结束这个问题,因为它似乎是codereview.stackexchange.com的更好的候选人。@DanO。从现在起,评估问题并使用以下理由:;需要重点关注,主要是基于意见等。