當我計算兩個陣列中公共元素的數量時,我遇到了一個意想不到的結果。當我使用reduce函式時,它不起作用。但filter版本回傳正確的結果。我想知道我的reduce版本有什么問題。
var ls = [1, 2, 3, 4, 5];
var ms = [4, 5, 6, 1, 2];
console.log(ls.reduce((acc, e) => (ms.includes(e) ? 1 acc : 0), 0));
// 2, incorrect
console.log(ls.filter(e => ms.includes(e)).length);
// 4, correct
uj5u.com熱心網友回復:
因為在您的reduce版本中,當找不到元素時,您將回傳值重置acc為零而不是按原樣回傳
var ls = [1, 2, 3, 4, 5];
var ms = [4, 5, 6, 1, 2];
console.log(ls.reduce((acc, e) => (ms.includes(e) ? 1 acc : acc), 0));
// -----------------------------------------------------------^ here
// 4, now corrected
uj5u.com熱心網友回復:
當作為 reduce 函式的第一個引數的回呼函式命中 ls 陣列中的第三項“3”時,它會發現它不是 ms 陣列的成員。這會導致三元運算子回傳右手運算式 0,這會重置您的累加器變數 acc。這將在 0 處重新開始計數。
相反,您應該回傳累加器變數的當前值而不是 0,如下所示:
console.log(ls.reduce(acc,e) => (ms.includes(e) ? 1 acc: acc), 0));
這將為您提供 4 個匹配元素的正確計數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475664.html
標籤:javascript 减少
上一篇:下面程式的名稱屬性是否可以通過me.name物件直接更改?[復制]
下一篇:更改數字格式并將其作為數字獲取
