Как суммировать свойства в массиве объектов на основе условия

1

Я младший веб-разработчик, ищущий некоторые рекомендации для решения проблемы. Пожалуйста, извините меня, если я пропущу что-нибудь целостное, так как это мое первое сообщение.

У меня есть массив некоторых данных, возвращаемых так:

[
 {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}
]

Я думаю, что это, вероятно, будет включать "сокращение", но я немного не уверен, как действовать дальше. Любая помощь будет принята с благодарностью.

Заранее спасибо!

  • 0
    Вы пытались найти решение? Вы должны сначала попробовать это, чтобы увидеть, можете ли вы сделать это самостоятельно. Ознакомьтесь с документацией о сокращении () и посмотрите, сможете ли вы что-нибудь сделать
  • 1
    Вы передаете довольно странные значения даты. Что вы подразумеваете под последовательным в этом контексте? Или эти строки?
Теги:
arrays
reduce

3 ответа

0
Лучший ответ

Используя сокращение, вы можете сделать что-то вроде этого: 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;
}, []);
  • 0
    Это сработало отлично! Спасибо всем за помощь :)
1

Я думаю, вы можете использовать функцию уменьшения, подобную этой.

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);
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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню