![](/img/trans.png)
[英]How to re-write _.every/_.all from Underscore.js using _.reduce (and _.each)
[英]How to does _.reduce work in _.every underscore js re-implementation
我一整天都對 _.reduce 在這里的工作方式感到困惑。
_.every = function(collection, iterator) { var check = iterator || _.identity; var result = _.reduce(collection, function(accumulator, val) { return accumulator && !!check(val); }, true); return result; }; console.log(_.every([true, false, 1, 2, 3, 4], _.identity)); // ===> false
因此,據我了解 _.reduce 它遍歷集合,並且對於每個元素,在數組中的每個元素上調用迭代器(累加器,val),然后返回累加器,但我不明白第 4 行在做什么: 返回累加器 && !!check(val);。 為什么它不檢查 false,將其設置為累加器,然后檢查 1 並將其設置為累加器,然后移動到數組的其余部分,直到它達到 4,這意味着最后一個累加器為真? 對不起,如果這沒有意義。
.every
基本上是一個復合&&
。 其結果只能是true
,如果每一個元素也導致true
。
所以在這行代碼...
return accumulator && !!check(val);
... accumulator
是到目前為止的值。
如果 accumulator 為true
,那么到目前為止一切都很好。 它將調用check
數組的當前元素,將結果轉換為布爾值,然后返回。 返回值成為下一步的accumulator
。
如果 accumulator 為false
,那是因為數組中較早的部分返回了false
。 這意味着我們已經失敗了,沒有必要繼續檢查數組的其余部分。 即使數組后面的內容返回true
也沒關系。 因此這個表達式將返回false
,甚至不會調用check
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.