與map()的實現 ,filter()的實現中的迭代方法不一樣,reduce() 是歸併方法。
reduce 接收兩個引數:
第二個可選引數是作為歸併基礎的初始值
reduce 方法返回乙個最終的值。
**表示:
arr.reduce(function(prev, cur, index, arr){}, initialvalue)
與之前的迭代不同,歸併不是對每一項都執行目標函式,而是可以概括為如下兩步:
對陣列 [1,2,3] 歸併執行(prev, cur) => prev + cur
,流程如圖:
[1, 2, 3] //取出 1 + 2 ,填回 3
[3, 3] //
取出 3 + 3 ,填回 6
[6] //
最終結果為 6
所以得到 6 。
根據這個思路,得到第一版**如下
//第一版array.prototype.fakereduce = function
fakereduce(fn, base)
index += 1;
let result = fn.call(null, arr[0], arr[1], index, initialarr);
return
result;
};
注意點:
佇列方法 unshift()
splice() 方法,高程三將其譽為最強大的陣列方法
插入任意數量的項
替換,即刪除任意數量的項的同時,插入任意數量的項
返回值影響原陣列
從上面的總結可以看出,splice()
方法完全可以取代unshift()
方法。
而且,第一版中存在一些重複**,也可以改進。
由此得到第二版**
//第二版array.prototype.fakereduce = function
fakereduce(fn, base)
return
newvalue;
};
檢測:
let arr = [1, 2, 3, 4, 5];let sum = arr.fakereduce((prev, cur, index, arr) =>, 100);
console.log(sum);
輸出:
100 1 0 [ 1, 2, 3, 4, 5]100 2 1 [ 1, 2, 3, 4, 5]
200 3 2 [ 1, 2, 3, 4, 5]
600 4 3 [ 1, 2, 3, 4, 5]
2400 5 4 [ 1, 2, 3, 4, 5]
12000
最後加上型別檢測等
//第三版array.prototype.fakereduce = function
fakereduce(fn, base)
let initialarr = this
; let arr =initialarr.concat();
if(base) arr.unshift(base);
let index, newvalue;
while (arr.length > 1)
return
newvalue;
};
const reducehelper = (f, acc, arr) =>array.prototype.fakereduce = function
(fn, initialvalue)
支援 cb 函式的全部引數
const reducehelper = (fn, acc, idx, array) =>array.prototype.myreduce = function
(cb, initialvalue)
array.prototype.myreduce = function(cb, initialvalue)
return
acc}
手動實現reduce方法和splice方法
今天花了一點時間手寫了比較常用的一些方法的原始碼,其中,reduce和splice這兩個方法比別的略微複雜點,就分享一下啦 splice stratindex,delcount,ele1,ele2.該方法表示從startindex下標開始,刪除delcount個陣列元素,然後在startindex處...
如何手動實現死鎖
此篇 說明 在main方法中,例項化了兩個實現了runnable介面的deadlocktest物件test1和test2,test1的flag等於1,所以在thread1執行緒執行的時候執行的是run 方法後半部分的 test2的flag等於2,所以在thread2執行緒啟動的時候執行的是run 方...
reduce 方法實現 webpack 多檔案入口
這篇日誌,在開始接觸 webpack 時候就該寫了,現在發布也許對一些剛入此坑的童鞋能些許幫助。即使有點 low,重要的仍是分享 reduce 函式的設計意圖就是方便進行疊加運算 var arr 0,1,2,3 reduce 實現累加 var total arr.reduce function pr...