2016-06-13 5 views
-1


Я пытаюсь внести изменения в переменную с помощью пользовательского оператора (я объясню это теперь яснее).
У меня есть массив чисел, и у меня есть reduce(). Первые 2 числа будут добавлены, затем во втором сокращении они будут вычтены, затем умножаются, делятся и экспонируются. В основном:Переменная, содержащая оператор в Javascript

[1,2,3,4,5] -> 0 
1+2=3 
3-3=0 
0*4=0 
0/5=0 -> 0 

Так что я видел реализацию, как это:

f => f.reduce((a,b,c) => [a + b, a - b, a * b, a/b, a ** b][c % 5]) 

И задавался вопросом, могу ли я сделать массив операторов в некотором роде, и осуществить это, как это?

f => f.reduce((a,b,c) => a [+,-,*,/,**][c%5] b) 

Очевидно, что этот синтаксис неверен, но в терминах идеи существует нечто подобное?

+0

Поскольку операторы не являются объектами первого класса, нет, это не представляется возможным, к сожалению, (игнорируя 'eval'). – deceze

ответ

1

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

var f = [1, 2, 3, 4, 5]; 
 

 
console.log(
 
    f.reduce((a, b, c) => eval(a + ['+', '-', '*', '/'][c-1] + b)) 
 
);


Кроме того, я не предпочитаю использовать eval() см: Don't use eval needlessly!


UPDATE: Также как @NinaScholz сказал, что вы можете уменьшить код, используя строку вместо строкового массива. В этом случае как строка, так и массив имеют одинаковый эффект.

var f = [1, 2, 3, 4, 5]; 
 

 
console.log(
 
    f.reduce((a, b, c) => eval(a + '+-*/'[c - 1] + b)) 
 
);

+0

Ну, это, кажется, лучший ответ до сих пор .. Спасибо. –

+0

вы можете сократить его до 'f.reduce ((a, b, c) => eval (a + '+ - * /' [c-1] + b))' –

+0

@NinaScholz: ничего себе, это будет много better ... tanks :) –

1

Вы можете попробовать что-то вроде этого

var add = function(a, b) { 
 
    return a + b; 
 
    }, 
 
    sub = function(a, b) { 
 
    return a - b; 
 
    }, 
 
    mul = function(a, b) { 
 
    return a * b; 
 
    }, 
 
    div = function(a, b) { 
 
    return a/b; 
 
    }; 
 
var operations = [add, sub, mul, div]; 
 

 
var output = [1, 2, 3, 4, 5].reduce(function(p, c, i) { 
 
    return operations[i - 1](p, c) 
 
}); 
 

 
console.log(output);

Вы можете добавить дополнительные функции (пользовательские операторы) и определять порядок операций.

1

Вы можете использовать массив для операторов.

var array = [1, 2, 3, 4, 5], 
 
    op = [ 
 
     (a, b) => a + b, 
 
     (a, b) => a - b, 
 
     (a, b) => a * b, 
 
     (a, b) => a/b, 
 
    ]; 
 

 
console.log(array.reduce((r, a, i) => op[(i - 1) % 4](r, a)));

+0

Это не массив операторов, это массив функций (представлен в форме выражения лямбда). Это не совсем то, что мне нужно (мне нужно, чтобы код был как можно короче) –

Смежные вопросы