2017-08-06 98 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'));

相關問題