在Javascript

时间:2017-02-05 00:10:50

标签: javascript arrays numbers

关于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语句将所有四个操作函数合并到一个函数中,而不是为每个案例调用每个单独的函数?

编辑解释我的字母和数字数组,也改变了另一个完全不相关的主题的标题和标签。

2 个答案:

答案 0 :(得分:0)

比使用switch语句更好的方法是使用回调。

&#13;
&#13;
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;
&#13;
&#13;

这是递归方法:

&#13;
&#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;
&#13;
&#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 +添加的第二种解决方案的种类)。