iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

我的日常學習雜記與筆記整理系列 第 14

Day - 14 Array 陣列 - 06. 陣列方法 - map, filter, reduce

  • 分享至 

  • xImage
  •  

map()

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()

filter() 回傳的陣列會是包含呼叫它的陣列的元素,指定的 function 會是個回傳 truefalse 的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()

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

上一篇
Day - 13 JavaScript - Array 陣列
下一篇
Day - 15 JavaScript 的 null 與 undefined
系列文
我的日常學習雜記與筆記整理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言