Всем добрый вечер, уже достаточно давно не могу решить данную задачу:
В примере
https://jsfiddle.net/fytv3rku/2/
есть некоторое количество блоков с инпутами value которых мы вписываем и по клику на click суммируем. Суммируются как value дочерних инпутов родительского кликнутого блока, так и сумма инпутов второго блока тоже складывается с предыдущей суммой, в общем обычный reduce. По факту, мне просто нужно получить общую сумму абсолютно всех value инпутов. Так же я сохраняю значения инпутов в локальном хранилище для отрисовки в разметку и сохранению значения после перезагрузки. В песочнице всё хорошо работает и можно вывести в консоль общую сумму по клику сразу же по после перезагрузки страницы
console.log(accommodationSum)
Проблема в том, что в моём проекте по какой то причине при первом клике на 'click' reduce возвращает 0, то есть initialValue, а на втором клике уже всё отрабатывает по инструкции, то есть предположим что в локальном хранилище находится такая сумма:
key = [{sum: 12}],
то после перезагрузки в моём проекте выведется 0 как сумма
(console.log('sum: ', sum))
, при
key.reduce((acc, curr) => acc + curr.sum, 0)
хотя curr.sum по факту равен 12 и уже при втором клике выводит актуальное значение. Я долго разбирался и пришел в выводу что это из за того, скорее всего, что у меня getItem находится в глобальной области видимости и что то мешает reduce нормально отрабатывать, но в песочнице почему то работает. Так же в reduce при первом клике приходит заполненный массив, не пустой и почему initialValue отрабатывает не понятно. Извините за сумбур, накипело.
<div class="cart">
<input type="text" class="amount-one" value="0">
<input type="text" class="amount-two" value="0">
<input type="text" class="amount-three" value='0'>
<button>click</button>
</div>
<div class="cart">
<input type="text" class="amount-one" value="0">
<input type="text" class="amount-two" value="0">
<input type="text" class="amount-three" value='0'>
<button>click</button>
</div>
<div class="info"></div>
const currentTariff = JSON.parse(localStorage.getItem("cabins") || "[]");
const btn = document.querySelectorAll('button')
const info = document.querySelector('.info')
const render = (tariff = currentTariff) => {
[...tariff].forEach((el) => {
info.insertAdjacentHTML(
"beforeend",
`<div>${el.accommodation}</div>`)
})
}
render()
btn.forEach((button) => {
button.addEventListener("click", function(e) {
const cart = e.target.closest(".cart");
const countOne = cart.querySelector(".amount-one").value;
const countTwo = cart.querySelector(".amount-two").value;
const countThree = cart.querySelector(".amount-three").value;
const accommodationPass = //переменных статичное количество, поэтому без reduce
parseInt(countOne) +
parseInt(countTwo) +
parseInt(countThree);
const obj = {
countOne: countOne,
countTwo: countTwo,
countThree: countThree,
accommodation: parseInt(accommodationPass),
}
currentTariff.push(obj);
render([obj]);
updateState()
const accommodationSum = currentTariff.reduce(
(acc, curr) => acc + curr.accommodation,
0
);
console.log(accommodationSum)
})
function updateState() {
localStorage.setItem("cabins", JSON.stringify(currentTariff));
}
})