接續前一天的陣列方法介紹,今天是reduce()
和join()
。尤其reduce()
功能很強大,不但能遍歷陣列,還能將結果累積成任何型別,例如數字、字串、物件等,一起來看看吧~
array.reduce(callbackFn[accumulator, currentValue, currentIndex, array], initialValue)
第一個參數callbackFn
:裡面有包含四個參數,
accumulator
:累加器,前一次callback回傳的值currentValue
:當前的元素currentIndex
(選填):當前的索引值array
(選填):呼叫reduce的陣列本身第二個參數initialValue
(選填):初始值
initialValue
:accumulator
會是initialValue
,currentValue
是陣列第一個元素array[0]
。initialValue
:reduce()會以陣列的第一個元素作為初始值,也就是accumulator
會是陣列第一個元素array[0]
,currentValue
是陣列第二個元素array[1]
。const numbers = [3, 5, 7, 9];
const result = numbers.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 1);
console.log(result); //25
有提供initialValue
初始值,accumulator
會等於initialValue
,也就是1
。
currentValue
會等於陣列第一個元素,也就是3
。
accumulator | currentValue | 結果 |
---|---|---|
1 | 3 | 1 + 3 = 4 |
4 | 5 | 4 + 5 = 9 |
9 | 7 | 9 + 7 = 16 |
16 | 9 | 16 + 9 = 25 |
最後結果為25,執行次數4次。。
如果沒有提供initialValue
,accumulator
會等於陣列第一個元素,也就是3
。
currentValue
會等於陣列第二個元素,也就是5
。
const numbers = [3, 5, 7, 9];
const result = numbers.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
});
console.log(result); //24
accumulator | currentValue | 結果 |
---|---|---|
3 | 5 | 3 + 5 = 8 |
8 | 7 | 8 + 7 = 15 |
15 | 9 | 15 + 9 = 24 |
最後結果為24,可以看到執行次數變為3次。
與forEach()寫法比較一下:
const numbers = [3, 5, 7, 9];
let result = 0; // 當累加器
numbers.forEach(function (currentValue) {
result += currentValue; // 將每個數字累加到 result
});
console.log(result); // 24
因為forEach()不會回傳結果,所以必須另設一個變數存放累加過程。
const names = ["Waston", "Jeremy", "Tangerine", "Jami"];
const result = names.reduce(function (acc, name, index) {
acc[index + 1] = name; //用index作為屬性
return acc;
}, {});
console.log(result);
//{1: 'Waston', 2: 'Jeremy', 3: 'Tangerine', 4: 'Jami'}
初始值是 {}
空物件,callback函式執行時,name
是當前處理的元素,也就是陣列裡的名字字串,並將index
作為物件的屬性,並設置其值為 name
,最後得到一個物件{1: 'Waston', 2: 'Jeremy', 3: 'Tangerine', 4: 'Jami'}
。
reduce和forEach真的很像,都會把全部的元素跑一遍,差別在於reduce有累加器存放前一次callback回傳的值,而且可以把陣列改成一個字串、一個數值、一個物件等結果。
join(separator)
separator
(選填):可以指定分隔陣列元素的符號,沒有寫的話,預設是逗號,
。
沒有指定分隔符號:
const names = ["Waston", "Jeremy", "Tangerine", "Jami"];
const result = names.join();
console.log(result); //"Waston,Jeremy,Tangerine,Jami"
沒有提供 separator
,預設會使用逗號,
作為分隔符。
自訂其他分隔符號:
const names = ["Waston", "Jeremy", "Tangerine", "Jami"];
const result = names.join(""); //空字串分隔
console.log(result); //"WastonJeremyTangerineJami"
const result = names.join("-"); //連字號分隔
console.log(result); //"Waston-Jeremy-Tangerine-Jami"
以上分享,謝謝!
MDN - reduce
MDN - join
Day 13 咩色用得好 - Array.prototype.reduce (新手摧毀者)