2016-02-23 84 views
0

我有一个if语句在for in循环内工作正常,但是当我在末尾添加else语句时,代码会中断 - 就像在来自for..in循环的变量(在此例中为键)不会传递给else语句。下面的代码:JavaScript:其他语句在for..in循环中打破我的if语句

config = {'test1':2, 'test2':2, 'test3':5, 'test4':8} 

    for (key in config) { 
    if (isNaN(item)) { 
     return item; 
    } 
    if (key.indexOf(baseCcy) !== -1) { 
     console.log("match config"); 
     item = parseFloat(item).toFixed(config[key]); 
     return item; 
    } else { 
     item = parseFloat(item).toFixed(10); 
     return item; 
    } 
    } 

baseCcy和项目从角的输入,从下面的代码:| {{fill.price | decimalFilter:baseCcy}}这样做的关键是创建一个自定义过滤器和我做的过滤器内部for..in循环实现它。到目前为止,它运行良好,但其他语句只是打破了它。 else语句的要点是,如果item的输入都不匹配config数组,则返回10位小数的项。当我console.log key for..in循环后,它只显示我“test1”,但当我删除else语句(只有两个if)时,console.log键显示我“ test1“,”test2“,”test3“,”test4“。 '

+0

如果和其他人都有一个返回语句,所以你的for循环将永远停止后的第一个项目。我*想*你想要的是将else的主体移到循环后面,这样只有在循环结束时没有任何项匹配if条件时才会发生。 – nnnnnn

+0

现在你有什么建议使用for循环?你想最后返回所有的项目还是返回第一个循环本身? –

+0

@Reddy for循环的目的是获得数组config('test1','test2')的所有属性名称。然后运行if语句以将输入(item)与来自for..in(key)的变量相匹配。首先,如果返回给我的是默认状态下的项目,如果它是NaN,则返回if语句(如果是核心部分),则else语句是如果输入不匹配,返回默认值+ 10个小数。 – Mjaaay

回答

0

只是作出一些改变,以你目前的逻辑,这必须为你工作。

config = {'test1':2, 'test2':2, 'test3':5, 'test4':8} 
var newItemValue; // a new varialble 
    for (key in config) {  
    if (isNaN(item)) { 
     newItemValue = item 
     break; //break once you find the match 
    //return item;  
    } 
    else if (key.indexOf(baseCcy) !== -1) { 
     console.log("match config"); 
     item = parseFloat(item).toFixed(config[key]); 
     newItemValue = item 
     break;//break once you find the match 
     //return item;  
    } 
    } 
    //if the loop was a failure, then do this by default. 
    if(typeof newItemValue === 'undefined'){ // check if there is no value assigned to the new variable, if its not then the loop was a failure 
     item = parseFloat(item).toFixed(10); 
     newItemValue = item  
    } 

这里是一个链接到Working JsFiddle

上述逻辑的输出是(当item = 12.12345678baseCcy ='test3'

12.12346 

编辑:阅读你最后的评论之后,我觉得这是你想要的。

config = {'test1':2, 'test2':2, 'test3':5, 'test4':8} 

    for (key in config) { 
    if (isNaN(item)) { 
     return item; 
    } 
    if (key.indexOf(baseCcy) !== -1) { 
     console.log("match config"); 
     item = parseFloat(item).toFixed(config[key]); 
     return item; 
    } 
    } 
    //if the program has reached this line then the loop was a failure 
    item = parseFloat(item).toFixed(10); 
    return item; 

这里不需要新的变量,其他的东西。

+0

我正在创建一个新的对象,它是您的配置的修改版本。 –

+0

好,让我改变逻辑,我以为'item'是你当前的对象属性值循环 –

+0

我的不好!我没有提供所有的细节,因为它是一个混乱的代码库+我认为它有一个明显的新手错误。将来我会尝试隔离代码并提供一个jsfiddle,让我看看你的帮助,我很快就会回来。 – Mjaaay

2

你只能从一个函数返回!

如果要退出循环结构,请使用break

链接到相关的doc

例子:

var conf; 

for (key in config) { 

    var item = config[key]; 

    if (isNaN(item)) { 
     conf = item; 
     break; 
    } 
    if (key.indexOf(baseCcy) !== -1) { 
     console.log("match config"); 
     item = parseFloat(item).toFixed(config[key]); 
     conf = item; 
     break; 
    } else { 
     item = parseFloat(item).toFixed(10); 
     conf = item; 
     break; 
    } 
} 
+0

嘿,这个如果实际上是我的控制器里面的一个功能。我认为我不需要包括整个代码,我的坏。它看起来像这样:'app.filter('decimalFilter',function(){返回函数(item){var baseCcy,config,key ;''等等......我说,代码的工作,只是不与其他声明,我认为这足以暗示,这是一个功能已经 – Mjaaay

+0

请张贴一个Jsfiddle,所以我们可以调查 –

+0

道歉,不提出一个小提琴,I假设我的if语句中有一个明显的新手错误,但我现在看到我需要提供更多细节。让我查看一下,看看我是否可以创建一个小提琴 – Mjaaay