Суммировать значения предыдущих дат по сегодняшней дате

#javascript #object #ecmascript-6

Вопрос:

Я хочу рассчитать значения предыдущих дат до текущей даты и так далее. Вот мой сценарий.

  • Я уже получил стоимость акций за предыдущий день для первоначального предварительного запаса, т. е. let prevStock = 21
 let prevStock = 21; 
let stocksArr= [
  { date: '2021-06-30',stock: 4 },
  { date: '2021-07-01',stock: 5 },
  { date: '2021-07-02',stock: 2 },
  { date: '2021-07-03',stock: 1 },
  { date: '2021-07-04', stock: 5 },
  { date: '2021-07-05',stock: 3 },
  { date: '2021-07-06', stock: 4 },
  { date: '2021-07-07',stock: 1 },
  { date: '2021-07-08', stock: 4 }
]

stocksArr.reduce((acc, cur, idx, arr) => {
  const prod = idx === 0 ? 0 : arr[idx - 1].stock;
  const value = acc   cur.stock   prod;
  cur.stock = acc;
  return value;
}, prevStock); 
  console.log(stocksArr)
 

Ожидаемые результаты:

     [{ date: '2021-06-30',stock: 21 },
      { date: '2021-07-01',stock: 24 },
      { date: '2021-07-02',stock: 29 },
      { date: '2021-07-03',stock: 31 },
      { date: '2021-07-04', stock: 32 },
      { date: '2021-07-05',stock: 37 },
      { date: '2021-07-06', stock: 40 },
      { date: '2021-07-07',stock: 44 },
      { date: '2021-07-08', stock: 45 }]
 

Какое правильное решение для ее решения?

 let prevStock = 21;
let stocksArr= [
  { date: '2021-06-30',stock: 4 },
  { date: '2021-07-01',stock: 5 },
  { date: '2021-07-02',stock: 2 },
  { date: '2021-07-03',stock: 1 },
  { date: '2021-07-04', stock: 5 },
  { date: '2021-07-05',stock: 3 },
  { date: '2021-07-06', stock: 4 },
  { date: '2021-07-07',stock: 1 },
  { date: '2021-07-08', stock: 4 }
]

stocksArr.reduce((acc, cur, idx, arr) => {
  const prod = idx === 0 ? 0 : arr[idx - 1].stock;
  const value = acc   cur.stock   prod;
  cur.stock = acc;
  return value;
}, prevStock); 
  console.log(stocksArr) 

Ответ №1:

если вы хотите получить совокупные результаты, вот ответ

     var stocksArr= [
      { date: '2021-06-30',stock: 4 },
      { date: '2021-07-01',stock: 5 },
      { date: '2021-07-02',stock: 2 },
      { date: '2021-07-03',stock: 1 },
      { date: '2021-07-04', stock: 5 },
      { date: '2021-07-05',stock: 3 },
      { date: '2021-07-06', stock: 4 },
      { date: '2021-07-07',stock: 1 },
      { date: '2021-07-08', stock: 4 }
    ]
    
var result = stocksArr.reduce(function(r, a) {
  if (r.length > 0)
    a.stock  = r[r.length - 1];
  r.push(a.stock);
  a['sum'] = a.stock
  return r;
}, [21]); // <-- pass intialValue to here

    
    console.log(stocksArr) 
     [
  {
    "date": "2021-06-30",
    "stock": 25,
    "sum": 25
  },
  {
    "date": "2021-07-01",
    "stock": 30,
    "sum": 30
  },
  {
    "date": "2021-07-02",
    "stock": 32,
    "sum": 32
  },
  {
    "date": "2021-07-03",
    "stock": 33,
    "sum": 33
  },
  {
    "date": "2021-07-04",
    "stock": 38,
    "sum": 38
  },
  {
    "date": "2021-07-05",
    "stock": 41,
    "sum": 41
  },
  {
    "date": "2021-07-06",
    "stock": 45,
    "sum": 45
  },
  {
    "date": "2021-07-07",
    "stock": 46,
    "sum": 46
  },
  {
    "date": "2021-07-08",
    "stock": 50,
    "sum": 50
  }
]
 

Комментарии:

1. Спасибо за ответ. одинаковые значения накопления должны быть указаны в соответствующие даты.

2. ТАКИМ образом, ожидается, что тот же массив объектов вернется. Следите при уменьшении, чтобы исходный массив объектов не мутировал

3. @mplungjan он должен принимать мои инициализированные значения, которые let prevStock = 21;

4. @подчеркивание a= a.stock ; это будет работать вместо»a [«сумма»»] = a.запас . I want notify you that my initial value is пусть prevStock = 21; » необходимо учитывать первые результаты

5. @Jay пожалуйста, проверьте обновленный код. вы можете просто передать значение Intial в функцию редуктора после обратного вызова