Обработка записи результата в массив

Есть массив, в который записываются все клики на калькуляторе. Далее этот массив выводится на страницу в виде строки, то есть в историю может вывестись =5+5=10 (первый знаки умножения, чего быть не должно, подряд знаки, чего быть тоже не должно). Как сделать исключения, чтобы не все подряд в массив пихалось?

    const calculator = {
    displayValue: '0',
    firstOperand: null,
    waitingForSecondOperand: false,
    operator: null,
    expressionData: [],
    historyData: [],
};

function inputDigit(digit) {
    const {
        displayValue,
        waitingForSecondOperand
    } = calculator;

    if (waitingForSecondOperand === true) {
        calculator.displayValue = digit;
        calculator.waitingForSecondOperand = false;
    } else {
        calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
    }
    calculator.expressionData.push(digit);
}

function inputDecimal(dot) {
    // If the `displayValue` does not contain a decimal point
    if (!calculator.displayValue.includes(dot)) {
        // Append the decimal point
        calculator.displayValue += dot;
        calculator.expressionData.push(dot);
    }
}

function handleOperator(nextOperator) {
    calculator.expressionData.push(nextOperator);
    const {
        firstOperand,
        displayValue,
        operator
    } = calculator
    const inputValue = parseFloat(displayValue);

    if (operator && calculator.waitingForSecondOperand) {
        calculator.operator = nextOperator;
        return;
    }

    if (firstOperand == null) {
        calculator.firstOperand = inputValue;
    } else if (operator) {
        const currentValue = firstOperand || 0;
        const result = performCalculation[operator](currentValue, inputValue);

        calculator.displayValue = String(result);
        calculator.firstOperand = result;
        calculator.expressionData.push(result);
        calculator.historyData.push({expression: calculator.expressionData.join('')});
        calculator.expressionData = [];
        resultation();
    }

    calculator.waitingForSecondOperand = true;
    calculator.operator = nextOperator;
}
function resultation () {
    let resulstHistory = document.getElementById('results');
    let string = '';
    for (let key in calculator.historyData) {
        string += '' + calculator.historyData[key]['expression'] + "<br>";
        console.log(calculator.historyData[key]['expression'])
    };
    resulstHistory.innerHTML = string

}
const performCalculation = {
    '/': (firstOperand, secondOperand) => firstOperand / secondOperand,

    '*': (firstOperand, secondOperand) => firstOperand * secondOperand,

    '+': (firstOperand, secondOperand) => firstOperand + secondOperand,

    '-': (firstOperand, secondOperand) => firstOperand - secondOperand,

    '=': (firstOperand, secondOperand) => secondOperand
};

function resetCalculator() {
    calculator.displayValue = '0';
    calculator.firstOperand = null;
    calculator.waitingForSecondOperand = false;
    calculator.operator = null;
}

function updateDisplay() {
    const display = document.querySelector('.calculator-screen');
    display.value = calculator.displayValue;
}

updateDisplay();


const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
    const {
        target
    } = event;
    if (!target.matches('button')) {
        return;
    }

    if (target.classList.contains('operator')) {

        handleOperator(target.value);
        updateDisplay();
        return;
    }

    if (target.classList.contains('decimal')) {
        inputDecimal(target.value);
        updateDisplay();
        return;
    }

    if (target.classList.contains('all-clear')) {
        resetCalculator();
        updateDisplay();
        return;
    }

    inputDigit(target.value);
    updateDisplay();
});

Ответы (1 шт):

Автор решения: EzioMercer

Скажу алгоритм, который я бы сам использовал, если бы хотел решить именно таким способом (это не конечный 100% работающий во всех случаях алгоритм, но его очень легко дополнить для нужного результата):

  • Создаём метод (canBeFirst), который определяет является входной символ симоволом, который может идти вначале
  • Создаём метод (isSpecSymbol), который определяет является входной символ спец симоволом (если по простому то проверяем является ли входной символ числом или нет)
  • Создаём метод (addToArr), который смотрит на последний элемент массива и на входной символ. Если массив пустой то вызываем canBeFirst, если можно то добавляем, если нет то не добавлем. Если массив не пустой, то вызываем isSpecSymbol для входного и последнего элемента массива, если оба будут true, то не добавлем, если один true, а другой false, то добавляем

Надеюсь смог помочь

→ Ссылка