function reducer(state, { type, ШО, СКОКА, БАБЛО }) { if (!state) { return { пиво: { count: 100, price: 10 }, чипсы: { count: 100, price: 10 }, сиги: { count: 100, price: 10 }, касса: 0 } } if (type === 'КУПИТЬ' && СКОКА <= state[ШО].count && БАБЛО >= state[ШО].price * СКОКА) { return { ...state, касса: state.касса + state[ШО].price * СКОКА, [ШО]: { ...state[ШО], count: state[ШО].count - СКОКА } } } return state } function createStore(reducer) { let state = reducer(undefined, {}) let cbs = [] const getState = () => state const subscribe = cb => (cbs.push(cb), () => cbs = cbs.filter(c => c !== cb)) const dispatch = action => { const newState = reducer(state, action) if (newState !== state) { state = newState } for (let cb of cbs) { cb() } } return { getState, dispatch, subscribe } } function createTable(obj) { table.innerText = '' for (let [key, value] of Object.entries(obj)) { let tr = document.createElement('tr'); let td = document.createElement('td'); td.innerText = key tr.append(td); table.append(tr); if (typeof value === 'object') { for (let [key1, value1] of Object.entries(value)) { let td = document.createElement('td'); td.innerText = key1 + ' : ' + value1; tr.append(td); } } else { let td = document.createElement('td'); td.innerText = value; tr.append(td); } } } const store = createStore(reducer); createTable(store.getState()) store.subscribe(() => createTable(store.getState())); btn.onclick = (() => store.dispatch({ type: 'КУПИТЬ', ШО: select.value, СКОКА: sum.value, БАБЛО: money.value }))