关于switch语句的大问题。我是JS的新手。
我正在尝试创建一个从输入框输入的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 :(得分: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));
&#13;
这是递归方法:
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));
&#13;
答案 1 :(得分: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
将加法的操作数显式转换为数字(如果它们是&#39;整数)或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 +
添加的第二种解决方案的种类)。