Javascript арифметические операторы в строковом массиве - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть следующий массив.

var signs = ['+', '-', '*', '/'];

И следующие переменные для добавления с каждым указанным выше знаком в массиве.

var right_digit = 1;
var left_digit = 5;

Могу ли я сделать что-то вроде ниже в JS?

var answer = left_digit sign[0] right_digit;

Ответы [ 5 ]

8 голосов
/ 01 ноября 2011

Если вы хотите избежать eval, вы можете сделать что-то вроде:

var signs = {
    '+': function(op1, op2) { return op1 + op2; },
    ...
};

var answer = signs['+'](left_digit, right_digit);
3 голосов
/ 01 ноября 2011

Я почти уверен, что вы не можете сделать это, но вы можете создать функцию, которая сделает это.

function action(a, b, c) {
    switch (c) {
        case "+":
            return a+b;
        case "-":
            return a-b;
        case "*":
            return a*b;
        default:
            return a/b;
    }
}
0 голосов
/ 01 ноября 2011

Безопасное eval решение (отфильтровывает цифры и подписывает и выдает ошибку, если оно не в этом формате):

function calculate(expr) {
    var matches = /^(\d+)([+\-*/])(\d+)$/.exec(expr);

    if(!matches) {
        throw "Not valid";
    }

    return eval(matches[1] + matches[2] + matches[3]);
}

calculate('2*4'); // 8

Так что вы можете сделать:

calculate(left + sign + right);
0 голосов
/ 01 ноября 2011

Вы можете использовать eval:

var answer = eval(left_digit + sign[0] + right_digit);
0 голосов
/ 01 ноября 2011

Вы можете использовать eval, если хотите динамически оценивать операторы таким образом:

var answer = eval(right_digit + sign[0] + left_digit);

Обратите внимание, что использование `eval не рекомендуется из-за потенциальных проблем безопасности (если данные не заслуживают доверия)и медленный, потому что код должен анализироваться каждый раз, когда он выполняется.

Лучше было бы использовать switch, например:

function calculate(a, operator, b) {
    switch (operator) {
      case "+":
        return a + b;
      case "-":
        return a - b;
      case "*":
        return a * b;
      case "/":
        return a / b;
    }
}
var answer = calculate(right_digit, sign[0], left_digit);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...