簡體   English   中英

檢查數組中的所有元素是否相等

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM