2017-08-06 100 views
3

这是我对SO的第一个问题。我有一个任务,我应该创建一个函数,它有两个参数 - 第一个是字符串数组,第二个是可能在数组中匹配的字符串。为什么我的for循环返回正确的答案,但我的forEach不?

我有两个变体的函数:一个使用“for”循环,另一个使用.forEach()方法。 for循环根据数组中是否存在第二个参数,准确地返回“true”/“false”。 forEach总是返回“false”。

有人可以解释为什么吗?下面的代码:

.forEach()版本:

function insideArray (array, word) { 
    var value; 
    array.forEach(function(each) { 
    if(each === word) { 
     value = "true"; 
     return value; 
    } 
    else { 
     value = "false"; 
    } 
    }); 
    return value; 
} 

for循环版本:

function insideArray (array, word) { 
    var value; 
    for(var i = 0; i < array.length; i++) { 
    if(array[i] === word) { 
     value = "true"; 
     return value; 
    } 
    else { 
     value = "false"; 
    } 
    } 
    return value; 
} 

甲样本阵列:

var heroArray = [ "spiderman", "wolverine", "batman", "greenArrow", "boosterGold" ]; 

测试.forEach():

insideArray(heroArray, "spiderman"); 
"false" 

测试for循环:

insideArray(heroArray, "spiderman"); 
"true" 

感谢您的帮助提前!

+1

尝试走过你的代码调试器,一行行,看看它做什么。 – 2017-08-06 22:31:27

回答

3

发生这种情况是因为您从forEach的回调函数返回,而不是从insideArray()开始,因此最终insideArray()将始终返回false,除非您匹配数组中的最后一个元素。您可以通过虚假的初始化值,这样去除其他条件修复代码:

function insideArray (array, word) { 
    var value = "false"; 
    array.forEach(function(each) { 
    if(each === word) { 
     value = "true"; 
    } 
    }); 
    return value; 
} 

另外请注意,您可以通过使用indexOf写这更简单的代码:

function insideArray (array, word) { 
    return array.indexOf(word) >= 0 ? "true" : "false"; 
} 
2

.forEach方法没有按“T返回任何东西,所以我修改代码以下列:

function insideArray (array, word) { 
    var value = "false"; 
    array.forEach(function(each) { 
    if(each === word) { 
     value = "true"; 
    } 
    }); 
    return value 
}; 
1

你不能break/return出的Array#forEach循环,尽管你可以从它throwcatch(但不要)。如果你打算像那样测试,Array#some可能是更好的选择。一个更好但支持稍差的方法是使用Array#includespolyfills are available或与babel一起转运)。另一个解决方案是Array#indexof

function insideArray(array, word) { 
 
    return String(array.some(function(each) { 
 
    return each === word; 
 
    })); 
 
} 
 

 
var heroArray = ['spiderman', 'wolverine', 'batman', 'greenArrow', 'boosterGold']; 
 

 
console.log(insideArray(heroArray, 'supergirl')); 
 
console.log(insideArray(heroArray, 'batman'));

const insideArray = (array, word) => String(array.includes(word)); 
 
const heroArray = ['spiderman', 'wolverine', 'batman', 'greenArrow', 'boosterGold']; 
 
console.log(insideArray(heroArray, 'supergirl')); 
 
console.log(insideArray(heroArray, 'batman'));

相关问题