Javascript 如何根据条件对对象数组中的属性求和
我是一名初级Web开发人员,正在寻找解决问题的指导。请原谅,如果我遗漏了什么,因为这是我第一次在这里发帖 我有一个返回的数据数组,如下所示:Javascript 如何根据条件对对象数组中的属性求和,javascript,arrays,reduce,Javascript,Arrays,Reduce,我是一名初级Web开发人员,正在寻找解决问题的指导。请原谅,如果我遗漏了什么,因为这是我第一次在这里发帖 我有一个返回的数据数组,如下所示: [ {x: Date(1234), y: 0} {x: Date(1235), y: 0} {x: Date(1236), y: 300} {x: Date(1237), y: 300} {x: Date(1238), y: 300} {x: Date(1239), y: 300} {x: Date(1240), y: 300} {x: D
[
{x: Date(1234), y: 0}
{x: Date(1235), y: 0}
{x: Date(1236), y: 300}
{x: Date(1237), y: 300}
{x: Date(1238), y: 300}
{x: Date(1239), y: 300}
{x: Date(1240), y: 300}
{x: Date(1241), y: 0}
{x: Date(1242), y: 0}
{x: Date(1243), y: 0}
]
如果可能的话,我想返回一个新数组,其中所有连续的大于0的“y”值相加。在新数组中,求和值应与求和项的第一个“x”值相关联,如下所示:
[
{x: Date(1234), y: 0}
{x: Date(1235), y: 0}
{x: Date(1236), y: 1500}
{x: Date(1241), y: 0}
{x: Date(1242), y: 0}
{x: Date(1243), y: 0}
]
我认为这可能涉及“减少”,但我有点不确定如何继续。任何帮助都将不胜感激
提前谢谢 我认为您可以使用这样的reduce函数
var-arr=[{
x:日期(1234年),
y:0
},
{
x:日期(1235年),
y:0
},
{
x:日期(1236年),
y:300
},
{
x:日期(1237年),
y:300
},
{
x:日期(1238年),
y:300
},
{
x:日期(1239年),
y:300
},
{
x:日期(1240年),
y:300
},
{
x:日期(1241年),
y:0
},
{
x:日期(1242年),
y:0
},
{
x:日期(1243年),
y:0
}
];
var yGreaterThanZero=null;
聚合var=arr.reduce(函数(acc、cur){
如果(当前y>0){
如果(!yGreaterThanZero){
acc.push(当前);
yGreaterThanZero=cur;
}否则{
yGreaterThanZero.y+=当前y;
}
}否则{
acc.push(当前);
}
返回acc;
}, []);
console.log(聚合)代码>这是一个非常粗糙的逻辑。当获得大于0的值时,我们开始录制,并在录制结束时按它(值小于0)
var a=[
{x:Date(1234),y:0},
{x:Date(1235),y:0},
{x:Date(1236),y:300},
{x:Date(1237),y:300},
{x:Date(1238),y:300},
{x:Date(1239),y:300},
{x:Date(1240),y:300},
{x:Date(1241),y:0},
{x:Date(1242),y:0},
{x:Date(1243),y:0},
{x:Date(1244),y:200},
{x:Date(1245),y:200},
{x:Date(1246),y:200},
{x:Date(1247),y:200},
]
var newA=[];
var记录=错误;
var temp={}
a、 forEach(项目=>{
如果(项目y>0){
记录=真;
如果(温度y){
如果(!temp.x)temp.x=项目x;
y温度=y温度+y项目
}否则{
温度=项目;
}
}否则{
如果(录制)新推送(温度)
记录=假;
温度={};
推送(项目);
}
})
如果(录制)新推送(温度)
console.log(newA)
使用reduce,可以执行以下操作:
var输入=[
{x:Date(1234),y:0},
{x:Date(1235),y:0},
{x:Date(1236),y:300},
{x:Date(1237),y:300},
{x:Date(1238),y:300},
{x:Date(1239),y:300},
{x:Date(1240),y:300},
{x:Date(1241),y:0},
{x:Date(1242),y:0},
{x:Date(1243),y:0},
];
var输出=输入。减少(功能(acc、val){
var lastIndex=附件长度-1;
if(val.y)您是否尝试了一个解决方案?您应该首先尝试一下,看看您是否可以自己做。签出文档,看看您是否可以做一些事情。您正在传递非常奇怪的日期值。在这种情况下,连续是什么意思?或者这些字符串是什么?
var input = [
{x: Date(1234), y: 0},
{x: Date(1235), y: 0},
{x: Date(1236), y: 300},
{x: Date(1237), y: 300},
{x: Date(1238), y: 300},
{x: Date(1239), y: 300},
{x: Date(1240), y: 300},
{x: Date(1241), y: 0},
{x: Date(1242), y: 0},
{x: Date(1243), y: 0},
];
var output = input.reduce(function (acc, val) {
var lastIndex = acc.length - 1;
if (val.y <= 0 || lastIndex < 0 || acc[lastIndex].y <= 0) {
acc.push(val);
} else {
acc[lastIndex].y += val.y;
}
return acc;
}, []);