2017-02-05 3 views
-1

Хорошо, что вопрос о операторах switch. Я новичок в JS.Использование операторов Switch в Javascript

Я пытаюсь сделать оператор switch, который принимает ввод из поля ввода, ищет «вычитание» «добавление» и «разделение» между буквами и цифрами во входной строке и отделяет не-цифры от чисел, а затем выполняет типизированную операцию по набору чисел. Так, например, поле ввода может выглядеть следующим образом:

1 a 2 b 3 c 4 multiply d 5 e 

До сих пор я был в состоянии отделить число от не чисел в массивах, которые будут выглядеть следующим образом, учитывая вход выше:

numberArray === [1,2,3,4,5] 
letterArray === [a,b,c,multiply,d,e] 

и у меня есть функции, установленные для добавления, вычитания, умножения и деления массива чисел, поэтому как я могу включить использование оператора switch, чтобы найти один из тех многих возможных входов в моем массиве букв?

Другое дело, все петли, используемые для математических операций аналогичны, например, вычитание выглядит следующим образом:

for (; i < numberArray.length; i++) { 
    if (i === 0) { 
     sub = numberArray[0] 
    } else { 
     sub = sub - numberArray[i] 
    } 
} 

и умножение выглядит следующим образом:

for (; i < numberArray.length; i++) { 
    if (i === 0) { 
     sub = numberArray[0]; 
    } else { 
     sub = sub * numberArray[i]; 
    } 
} 

Будет ли возможно использовать тот же оператор switch, чтобы объединить все четыре функции работы в одну функцию, вместо того, чтобы вызывать каждую отдельную функцию для каждого случая?

Отредактировано, чтобы объяснить мои письма и числовые массивы, также изменить название и теги из другой темы, которая была полностью не связана.

+0

Объясните это '1 a 2 b 3 c 4 multiply d 5 e' !!!! Что такое 'a',' b' ...? –

+0

@ibrahimmahrir здесь Я отредактирую его – Giverbud

+0

Вы все еще не объяснили, что такое 'a',' b' ... –

ответ

0
//strings === array of strings 
//numbers === array of numbers 

// list of all the operations and the function associated with it 
var operations = { 
    add: function(a, b) { return Number(a) + Number(b); }, 
    substract: function(a, b) { return a - b; }, 
    multiply: function(a, b) { return a * b; }, 
    divide: function(a, b) { return a/b; } 
} 

// check if an operation exist 
var found = false; 
var op; 
for(op in operations) { // loop through the key of the operations object 
    if(strings.indexOf(op) != -1) { // if strings contain that operation 
    found = true; // then we have found one 
    break; // stop the search 
    } 
} 

if(found && numbers.length) { // if we have found an operation and there is numbers 
    var result = numbers[0]; 
    for(var i = 1; i < numbers.length; i++) // apply the function associated with the operation on all the numbers 
    result = operations[op](result, numbers[i]); 
    alert(result); 
} 
else // if there is an error (no operation or no numbers) 
    alert("no number or no operation!"); 

Дополнение Объяснение:

Поскольку + используется либо цифры суммы или конкатенации строк операндов Кроме того, должен быть явно преобразуются в число с помощью parseInt (если они целых чисел) или parseFloat (если они с плавающей точкой) или Number (если не уверен), как:

return parseFloat(a) + parseFloat(b); 
// or 
return parseInt(a) + parseInt(b); 
// or 
return Number(a) + Number(b); 

Или неявно с помощью унарный + как:

return +a + +b; // to force the interpretter to interpret them as numbers 

Почему другие операции не вызвали проблему?

Потому что -, * и / используются только для номеров. Таким образом, операнды неявно интерпретируются как числа (вид второго решения для добавления с использованием unary +).

+0

Как эта часть работает в частности? Я должен определить op, не так ли? и в цикле for, что означает (op в операциях)? var found = false; var op; for (op в операциях) {// прокручиваем ключ объекта операции if (stringings.indexOf (op)! = -1) {// если строки содержат эту операцию found = true; // тогда мы нашли один break; // остановка поиска } } – Giverbud

+0

@Giverbud Вы знакомы с ** объектом ** s? 'for (var prop in Object)' цикл через ключи объекта. В этом случае объект является 'операциями', поэтому ключи' add', 'substract',' multiply' и 'divide'. Для всех этих операций мы видим, если один из них находится в массиве 'strings', используя' ** indexOf ** '. –

+0

Nevermind Я понял это, спасибо, вы помогли мне больше, чем вы могли подумать! – Giverbud

0

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

function reduce(array, operation, initialValue) { 
 
    var result = initialValue; 
 
    // We can reuse the same for loop logic with different operations 
 
    for (var i = 0; i < array.length; i++) { 
 
    result = operation(result, array[i]); 
 
    } 
 
    return result; 
 
} 
 

 
// This is the 'operation' that will get passed in to reduce 
 
function addition(a, b) { 
 
    return a + b; 
 
} 
 

 
var myArray = [1, 2, 3]; 
 

 
console.log(reduce(myArray, addition, 0)); 
 

 
// You can also add it to the array prototype and call it like this: 
 
function protoReduce(operation, initialValue) { 
 
    var result = initialValue; 
 
    for (var i = 0; i < this.length; i++) { 
 
    result = operation(result, this[i]); 
 
    } 
 
    return result; 
 
} 
 

 
Array.prototype.reduce = protoReduce; 
 
console.log(myArray.reduce(addition, 0));

А вот рекурсивный подход:

function reduce(array, operation) { 
 
    var initialValue = array.shift(); 
 
    var result; 
 
    if (array.length > 1) { 
 
    result = reduce(array, operation); 
 
    } else { 
 
    result = array[0]; 
 
    } 
 
    return operation(initialValue, result); 
 
} 
 

 
function addition(a, b) { 
 
    return a + b; 
 
} 
 

 
var myArray = [1, 2, 3, 4]; 
 

 
console.log('result:', reduce(myArray, addition));

+0

Извините, я запустил это сообщение (это было название, которое было сохранено из сообщения, которое я почти сделал некоторое время назад). Мне не нужна помощь в сокращении, но что делает обратный вызов? – Giverbud

+0

Следуйте за потоком выполнения в этом коде. Операция была отвлечена на другую функцию, которая передается в качестве аргумента. – epiqueras

+0

Итак, вы имеете в виду вызов другой функции? Поскольку все мои функции работы настолько схожи, что у меня есть чувство, что я могу использовать небольшие различия между ними в инструкции switch вместо четырех больших блоков кода, просто чтобы установить их как отдельные функции. – Giverbud