[英]check if all the elements in the array are equal
所以我正在制作一個函數來檢查數組中的元素是否相等,如果相等則返回true,如果它們不相等則返回false。 我最終得到了:
var uni;
function isUniform(uni) {
// capture first number of array
var base = uni[0];
// check if next numbers are equal to first number
for (var i = 0; i < uni.length; i++ ) {
if(uni[i] !== base){
return false;
}
else{return true;} }
}
我的問題是,無論我輸入什么數組到函數中,它總是會返回 true。 經過一些實驗,我最終將 return true 放在循環之外,它終於起作用了。
var uni;
function isUniform(uni) {
// capture first number of array
var base = uni[0];
// check if next numbers are equal to first number
for (var i = 0; i < uni.length; i++ ) {
if(uni[i] !== base){
return false;
}}
return true;
}
所以我的問題是:為什么我需要將“return true”放在 for 循環之外才能使函數工作? 我想我知道原因,但我想要一個解釋清楚。
當解釋器遇到return
,它會立即終止當前函數——而不僅僅是當前正在運行的塊。 所以,在你的第一個片段,第一個匹配的元素將導致return true
- isUniform
只會造成false
,如果每個元素都是不同的,你開始從第二個元素比較,而不是從第一個開始(因為arr[0] === arr[0]
始終為真,除非arr[0]
為 NaN 或類似的奇怪,例如對 getter 的引用)
但是按如下方式編寫函數會更容易:
const isUniform = (input) => { const base = input[0]; return input.every(element => element === base); } console.log(isUniform([0, 1, 2])); console.log(isUniform([0, 0, 0]));
假設您有以下內容:
[0,0,1]
前兩個元素相同,這將導致return true
執行。 return
終止函數,從而終止循環,因此最后一個條目(不同的)甚至永遠不會被比較!
親自看看以下循環如何只執行一次:
const loop = function () { for(let i=1; i<100000; i++) { console.log("I looped " + i + " time") return true } } loop()
在循環之外,您將 base 設置為等於列表中的第一項。 然后您將遍歷列表中的所有項目,包括第一個項目。 因此,第一次迭代總是正確的,因為 base = uni[0]。
如果你只處理數字,你可以試試這個:
function allNumbersEqual (arr) {
return Math.min(...arr) === Math.max(...arr);
}
console.log(allNumbersEqual([0.1, 0.1, 0.1, 0.1, 0.1, 0.1]));
// true
console.log(allNumbersEqual([0.1, 0.2, 0.3, 1, 2, 3]));
// false
既然可以在 O(n*2) 中完成,為什么要在 O(n) 中完成? :D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.