不是使用push()的有效方法?

时间:2017-09-09 01:26:26

标签: javascript

我正在尝试用字符串输入创建一个数组 条件。 这似乎不是一种使用push的有效方法,因为它不会返回只是数字的数组。

    function evaluate(input){ 
        function isOperator(ops){
            if(ops == '+' || ops == '*'){
                return true;
            } return false;
        }
        var stack = [];
        for(var char in input){
            if(!isOperator(char)){
                stack.push(input[char]);
            }
        } 
        return stack;
    }
    console.log(evaluate('7+**8'));

5 个答案:

答案 0 :(得分:2)

此行正在测试索引是否为运算符。这不是因为索引总是数字。

if(!isOperator( char )){   // char => 0, 1, 2, 3, 4
//              ^^^^

下一行使用索引从input字符串中访问单个字符:

stack.push( input[char] ); // input[char] => '7', '+', '*', '*', '8'
//          ^^^^^^^^^^^

这是重命名变量以避免混淆的好时机。

for (var index in input) {
    var char = input[index];
    if (!isOperator(char)) {
        stack.push(char);
    }
}

另外,将循环类型更改为one more suited for ordered collections

答案 1 :(得分:2)

您的代码存在许多问题。

for(var char in input)没有做你想做的事。它像对象一样迭代它。使用for (var i = 0; i < input.length; i++)。它不会有效率,但您也可以input.split().reduce(...)

input[char]将导致undefined,因为input['c']或类似内容不会存在。但是,切换到i作为索引将解决这个问题。

function evaluate(input){ 
    function isOperator(ops){
        if(ops == '+' || ops == '*'){
            return true;
        }
        return false;
    }
    var stack = [];
    for(var i = 0; i < input.length; i++){
        var char = input[i];
        if(!isOperator(char)){
            stack.push(char);
        }
    } 
    return stack;
}
console.log(evaluate('7+**8'));

或者reduce

return input.split().reduce(function (stack, value) {
    if (isOperator(value)) {
        return stack;
    }
    return stack.concat(value);
}, []);

答案 2 :(得分:0)

function evaluate(input){ 
    function isOperator(ops){
        if(ops == '+' || ops == '*'){
            return true;
        } return false;
    }
    var stack = [];
    for(var char in input){
        if(!isOperator(char)){
            stack.push(input[char]);
        }
    } 
    return stack;
}
console.log(evaluate('7+**8'));

假设您正在尝试按我的想法行事,这应该可行。你不能像JS那样做一个关联数组,但除此之外它看起来很好。确保您知道自己要调用的变量。

答案 3 :(得分:0)

您甚至无法检查输入是"+"还是"*"。您只是从false方法返回isOperator(ops),因为您的for循环只是从input方法计算evaluate(input)值索引。因此,您需要对其进行修复,以便检查"+""*"运算符。

答案 4 :(得分:0)

这是你想要的输出吗?

[
  "7",
  "8"
]

如果是这样,其他人已经用语法巧妙地解释了这些问题:for key in obj迭代对象,而不是数组。如果要以“传统”方式将字符串迭代为数组,则可以使用常规for循环:

function evaluate(input) {
  var output = [];
  for (var n = 0; n < input.length; n++) {
    if (! (input[n] === '*' || input[n] === '+'))  output.push(input[n]);
  }
  return output;
}
console.log(evaluate('7+**8'));

但你不必。如果您只想要所有数字而不需要操作符,那么这可能会赢得code golf挑战:

function evaluate(input) {
  return input.match(/\d/g); 
}
console.log(evaluate('7+**8'));