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

时间:2018-08-05 04:37:25

标签: 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: Date(1241), y: 0}
 {x: Date(1242), y: 0}
 {x: Date(1243), y: 0}
]

如果可能的话,我想返回一个新的数组,该数组中所有连续的y值都大于0。在新数组中,求和值应与求和项的第一个“ 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}
]

我认为这可能涉及“减少”,但我不确定如何进行。任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为您可以使用像这样的reduce函数。

var arr = [{
    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 yGreaterThanZero = null;
var aggregated = arr.reduce(function(acc, cur) {
  if (cur.y > 0) {
    if (!yGreaterThanZero) {
      acc.push(cur);
      yGreaterThanZero = cur;
    } else {
      yGreaterThanZero.y += cur.y;
    }
  } else {
    acc.push(cur);
  }
  return acc;
}, []);

console.log(aggregated);

答案 1 :(得分:0)

这是一个非常粗糙的逻辑。当获得大于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 recording = false;
var temp = {}
a.forEach(item => {
  if (item.y > 0) {
    recording = true;
    if (temp.y) {
      if(!temp.x) temp.x = item.x;
      temp.y = temp.y + item.y
    } else {
      temp = item;
    }
  } else {
    if (recording) newA.push(temp)
    recording = false;
    temp = {};
    newA.push(item);
  }
})
if (recording) newA.push(temp)

console.log(newA)

答案 2 :(得分:0)

使用reduce,您可以执行以下操作:https://jsbin.com/leladakiza/edit?js,console

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;
}, []);