Накопление значений предыдущего дня в текущую дату

avatar
Jay
1 июля 2021 в 17:31
36
2
0

Я хотел бы, чтобы накопленные значения производства за предыдущий день + носок обновили сегодняшнюю дату.

Я реализовал приведенные ниже фрагменты как работающие, как и ожидалось, но начальное значение, которое должно занять первый день, а затем сегодня запас + производство = следующая дата, так далее

let prevStock = 20;
let stocksArr= [
  { date: '2021-07-01', stock: 3, production: '5' },
  { date: '2021-07-02', stock: 7, production: '2' },
  { date: '2021-07-03', stock: 6, production: '1' },
  { date: '2021-07-04', stock: -3, production: '5' },
  { date: '2021-07-05', stock: 0, production: '3' },
  { date: '2021-07-06', stock: 10, production: '4' },
  { date: '2021-07-07', stock: 7, production: '1' },
  { date: '2021-07-08', stock: 10, production: '4' }
]

  stocksArr.reduce((acc, cur) => {
    const newArr = acc + cur.stock;
    cur.stock = acc;
    return newArr;
  }, 0);

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

results= [
  { date: '2021-06-30', stock: 21},
  { date: '2021-07-01', stock: 25},
  { date: '2021-07-02', stock: 30},
  { date: '2021-07-03', stock: 32},
  { date: '2021-07-04', stock: 33},
  { date: '2021-07-05', stock: 38},
  { date: '2021-07-06', stock: 41},
  { date: '2021-07-07', stock: 45},
  { date: '2021-07-08', stock: 56}
]

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

  stocksArr.reduce((acc, cur) => {
    const newArr = acc + cur.stock;
    cur.stock = acc;
    return newArr;
  }, 0);
console.log(stocksArr)

Каков правильный подход к ее решению?

Источник
Heretic Monkey
1 июля 2021 в 17:34
0

Почему запас на 30 июня 2021 г. должен быть равен 21, а не 0, как показано в первом объекте { date: '2021-06-30', stock: 0, production: '4' },?

Jay
1 июля 2021 в 17:37
0

сумма запасов + производство за предыдущий день, я получаю базу данных и инициализирую ее. поэтому у меня есть запасы предыдущего дня + производство

Jay
1 июля 2021 в 17:38
0

@HereticMonkey Итак, на основе запасов + производства за предыдущий день необходимо рассчитать.

Heretic Monkey
1 июля 2021 в 17:44
0

Что ж, я бы предложил вам использовать этот prevStock в качестве начального значения для вызова reduce (второй аргумент, где вы в настоящее время передаете 0. Кроме того, вам нужно будет добавить производство в newArr, если вы хотите, чтобы это для добавления (я бы преобразовал его в число, возможно, использовал parseFloat(cur.production) или parseInt, если эти значения всегда являются целыми значениями).

Joel Peltonen
1 июля 2021 в 17:53
0

Почему вы хотите использовать сокращение для этого? Кроме того, данные в stocksArr и result кажутся бессмысленными, откуда берется 2021-06-30??

Ответы (2)

avatar
Heretic Monkey
1 июля 2021 в 17:55
2

Вы очень близки; вам просто нужно использовать другие параметры, переданные в функцию reduce.

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

stocksArr.reduce((acc, cur, idx, arr) => {
  // use parseInt if you know these are always integers
  // if we're on the first line, don't look for a previous object
  // if not, get the previous object's production value
  const prod = idx === 0 ? 0 : parseFloat(arr[idx - 1].production);
  // newArr seemed like an odd name, so I changed it to value
  // Add the previous stock to the current stock, plus the previous day's production
  const value = acc + cur.stock + prod;
  // set the stock
  cur.stock = acc;
  return value;
}, prevStock); // using prevStock for the "initialValue"
console.log(stocksArr)
Jay
1 июля 2021 в 17:59
0

Спасибо за Ваш ответ

avatar
Liftoff
1 июля 2021 в 17:42
1

Вот пример с циклом for.

Первому элементу массива присваивается значение запаса prevStock, а затем каждая итерация цикла устанавливает текущий запас плюс текущее производство равным значению запаса следующего элемента.

Наконец, производственный ключ удаляется из каждого объекта, чтобы соответствовать ожидаемому результату.

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

stocksArr[0].stock = prevStock;
for(var i = 0; i < stocksArr.length-1; i++)
{
  stocksArr[i+1].stock = stocksArr[i].stock + parseInt(stocksArr[i].production);
  delete stocksArr[i].production;
}
delete stocksArr[stocksArr.length-1].production;

console.log(stocksArr);

Я слежу за вашим выводом до самой последней записи, где, как я полагаю, у вас есть опечатка в ожидаемом выводе, поскольку в вашем примере произведено одно изделие, но запас увеличился на 11.

Jay
1 июля 2021 в 17:54
0

Спасибо за ответ. Можно ли использовать функцию es6, чтобы сократить эти фрагменты?

Joel Peltonen
1 июля 2021 в 17:54
0

Итак, вы только что отредактировали входные данные, включив в них 2021-06-30?

Liftoff
1 июля 2021 в 17:55
0

Я скопировал исходный фрагмент. В этом фрагменте присутствует 2021-06-30.