map()
會將呼叫它的陣列中每個元素逐一傳入指定的 function 中,再回傳一個由指定的 function 回傳值所建立的新陣列,map()
不會修改到原有呼叫它的陣列,若是呼叫map()
的陣列是稀疏陣列,那麼回傳的也會是(新的)同樣的方式稀疏陣列,會有同樣的長度與缺少元素的位置
let subtotal = [100,200,300,500];
let summary = subtotal.map(function(num){
return num + num;
});
console.log(summary); //[ 200, 400, 600, 1000 ]
filter()
回傳的陣列會是包含呼叫它的陣列的元素,指定的 function 會是個回傳 true
或 false
的function,如果回傳值為 true
,那麼傳給指定的function的元素會被加到回傳的新陣列之中。
let subtotal = [10,20,30,50];
let summary = subtotal.filter(function(number,index){
return number % index === 0; // index: 0,1,2,3
// console.log(number % index); // NaN, 0, 0, 2
});
console.log(summary); //[ 20, 30 ] 只有20%1=0 ,30%2=0
filter()
會跳過稀疏陣列中的缺口,它的回傳值永遠都是非稀疏的陣列,若要關閉缺口(移除沒有元素)的位置,及刪除 undefined
或者 null
的元素:
let subtotal = [10, ,30, null, 50, undefined];
let summary = subtotal.filter(function(element,index){
return element !== undefined && element !== null;
});
console.log(summary); //[ 10, 30, 50 ]
reduce()
與 reduceRight()
會根據指定的 function,結合陣列的元素,產生一個值。
這是在函式型程式設計中常見的運算,也被稱為 inject(注入) 或 fold(摺疊) :
let number = [10, ,30, 5, 50, 100];
let summary = number.reduce(function(x,y){
console.log(`x: ${x}, y: ${y}`);
return x + y; // 這種函式藉由相加、相乘或取較大值來結合兩個值
},0); // 0 為function裡面 x 的起始值
/*
x: 0, y: 10
x: 10, y: 30 // x = 10 即為 0 + 10
x: 40, y: 5 // x = 40 即為 10 + 30 以此類推
x: 45, y: 50
x: 95, y: 100
*/
console.log(summary); //195
reduce()
的第一個引數是執行某種方式把兩個值結合或化簡成單一值的工作,並回傳此化簡後的值,reduce()
的第二個(非必須的)引數是要傳給reduce()
中 指定 function 的初始值。
當呼叫 reduce()
只用了一個引數,沒有指定初始值,它會把陣列的第一個元素當作初始值,並作為reduce()
中指定 function 的第一個引數,第二個元素則當作 function 的第二個引數。
let number = [ 12,2,35,4,5555]
let max = number.reduce(function(x , y){
return ( x > y ) ? x : y;
});
console.log(max); // 5555
在空陣列上呼叫reduce()
時,不帶初始值作為指定 function 的引數會導致 TypeError: Reduce of empty array with no initial value
。 但如果只用一個值作為引數,不管是使用單一元素的陣列且不帶初始值,或是使用空陣列並帶初始值, reduce()
都不會呼叫其指定的function(x,y)
,它只會回傳那一個值。
let number = []
let max = number.reduce(function(x , y){
return ( x > y ) ? x : y;
},1); // 空陣列並帶初始值
console.log(max); // 0
let number = [1]
let max = number.reduce(function(x , y){
return ( x > y ) ? x : y;
}); // 單一元素的陣列,不帶初始值
console.log(max); // 1