Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据条件对对象数组中的属性求和_Javascript_Arrays_Reduce - Fatal编程技术网

Javascript 如何根据条件对对象数组中的属性求和

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

我是一名初级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: 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;
}, []);