JS中的迭代(數組)


 

啥子是迭代?可以簡單地理解為按順序訪問目標(數組、對象等)中的每一項(其實和遍歷概念沒什么差別)

數組的迭代被我分為兩種:

  • 查找
  • 遍歷

 

查找:

  1.indexOf(item,start) 

    該方法搜索指定元素值位置,並返回下標。

    參數:item是要查找的值,start是指你要從哪里開始找(該參數可選)。ps:start是可以取負值的,舉個栗子indexOf(x,-5)表示從倒數第6個開始(因為倒數第一個是0嘛),一直找到正序的第0個

    如果多次出現,則返回第一次出現的下標(其實找到了就不會接着往后找了);如果沒出現,返回-1。

    var fruits = ["Apple", "Orange", "Apple", "Mango"];
    var a = fruits.indexOf("Apple");
    console.log(a);//0

  

  2.lastIndexOf(item,start)  與上面方法用法一樣,不同的地方是,他是逆行,是從結尾開始找的。start也能指定負值,如果start取-5,則表明從下標為5的地方開始,一直往前找。

    var fruits = ["Apple", "Orange", "Apple", "Mango"];
    var a = fruits.lastIndexOf("Apple");
    console.log(a);//2

 

  3.find()  方法返回通過測試函數的第一個數組元素的值。

  參數:(項目值,項目索引,數組本身)

var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction);

function myFunction(value, index, array) {
  return value > 18;
}

  

  4.findIndex()  方法返回通過測試函數的第一個數組元素的索引。

  參數:(項目值,項目索引,數組本身)

var numbers = [4, 9, 16, 25, 29];
var first = numbers.findIndex(myFunction);

function myFunction(value, index, array) {
  return value > 18;
}

 

上面的幾個方法沒什么好講的,接下來才是重點。

 

遍歷:這類方法有7個

  1.some()

  2.every()

    兩者的函數都接受三個值(項目值,項目索引,數組本身)

    這兩個方法都是依次對數組的每項進行判斷,返回boolean類型的值。不同的是,some是只要有一項滿足條件就返回true,而every要求所有項都滿足條件才會返回true。

    舉個栗子: 

  var a=[1,2,3,4,5,4,3,2,1];
  
var everyResult=a.every(function(item,index,a){   return (item>2);   });   var someResult=a.some(function(item,index,a){   return (item>2);   });
  alert("everyResult:"+everyResult);//false
  alert("someResult:"+someResult);//true

當然,也可以也成箭頭函數的形式:

a.some((item)=>{return item>2})

  這兩個方法只做判斷,都不會對數組進行改變。

 

  3.forEach()

  4.filter()

  5.map()

  為什么這三個一起講,因為他們像,與前面some,every一起常作為面試題考。

  三者的函數都接受三個值(項目值,項目索引,數組本身)

  forEach:其就和for循環異曲同工,循環遍歷,對每項進行操作。

  map:和forEach非常相似,其返回的是 每次函數調用后的結果所組成的數組

  filter:與上面兩者相似,但是其返回的是 函數調用結果值為true的項 (將調用的函數理解成表達式,即返回符合這個表達式所有項組成的新數組)

  區別:

    map和foreach其實用法上沒啥子區別,但是!還是有點差別的,foreach是沒有返回值的

    然后,filter顧名思義,過濾器,是過濾掉數組不符合條件的項。所以用途上,filter會有很大的不同,常用於篩選掉不要的數組項。

    我還是舉栗子吧:

  var a=[1,2,3,4,5,4,3,2,1];
  var filterResult=a.filter(function(item,index,a){
        return (item>2);
    });
var mapResult=a.map(function(item,index,a){ return item*2; });
  var foreachResult=a.forEach(function(item,index,a){
  if(item<5) a[index]=0;
  });
  alert("filterResult:"+filterResult);  //3,4,5,4,3
  alert("mapResult:"+mapResult);     //2,4,6,8,10,8,6,4,2
  alert("foreachResult:"+foreachResult); //underfined
  alert("foreachResult:"+a);        //0,0,0,0,5,0,0,0,0

  6.reduce()  

  7.reduceRight()

  參數: 

    • 總數(初始值/先前返回的值)
    • 項目值
    • 項目索引
    • 數組本身

  這次我直接舉栗子:

var a=[1,2,3,4,5,4,3,2,1];

var sum=a.reduce(function (prev,cur,index,array){
  return prev+cur;
})
alert("sum:"+sum);

  上訴用法是最常用的用法,用於對數組所有項進行求和。事實上求積也是可以的,這個方法的靈魂就是有了這個prev值,具體看你如何以應用(不過事實上用的不多,在外部var一個sum變量也可以做到)

  ps:reduce()和reduceRight()對於空數組是不會執行回調函數的。

 

  補充一點,注意:forEach,filter,every,some會跳過空位,map會跳過空位,但是會保留這個值。

 

  個人愚見,不喜憋着。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM