2016-12-19 45 views
-2
var atLeast = function (tab,n,k){ 
    var frequencyK = tab.reduce(function (acc, val, array){ 
     if (val == k){ 
      return acc+1; 
     } 
    }); 
    return frequencyK >= n; 
}; 
console.log(atLeast([1,2,3,2,2,4,2,2],4,2)); 

該功能是指如果參數ķ在陣列標籤至少Ñ次重複返回true。爲此,我使用了reduce,並且每當當前值等於k時累加器加1。然後我比較了用reduce函數計算的k的頻率與n函數使用reduce不工作;返回false時應該是真實

問題是,頻率K最終爲NaN。我無法弄清楚爲什麼。

+0

因爲你沒有在else語句中減少返回 – epascarello

+0

如果'val!= k'怎麼辦?那麼回調是什麼回報?接下來會是什麼? – deceze

回答

2

您需要返回reduce函數中的所有情況。

var atLeast = function (tab,n,k){ 
 
    var frequencyK = tab.reduce(function (acc, val, array){ 
 
     return val == k ? acc+1 : acc; //return the val for both cases 
 
    }, 0); //<-- set zero here 
 
    return frequencyK >= n; 
 
}; 
 
console.log(atLeast([1,2,3,2,2,4,2,2],4,2));

3

減少有兩個參數,減少功能和初始值,你放棄了初始值,因此與第一要素,這是錯誤的號碼開始。

此外,當您不返回任何內容時,下一個acc的值將爲undefined,在數學運算中這完全不會執行(這會讓您獲得NaN)。

爲了解決這個問題,作爲初始值增加0.reduce(),並返回在所有情況下,像這樣:

var atLeast = function (tab,n,k){ 
    var frequencyK = tab.reduce(function (acc, val, array){ 
     if (val == k){ 
      return acc+1; 
     } 
     return acc; 
    }, 0); 
    return frequencyK >= n; 
}; 
console.log(atLeast([1,2,3,2,2,4,2,2],4,2)); 

不過,我認爲下面是一個簡單的方法:

const atLeast = (tab, n, k) => tab.filter(item => item === k).length >= n; 
相關問題