JS Array常用方法indexOf/filter/forEach/map/reduce詳解


Array共有九個方法
 
Array.prototype.indexOf
Array.prototype.lastIndexOf
Array.prototype.every
Array.prototype.some
Array.prototype.forEach
Array.prototype.map
Array.prototype.filter
Array.prototype.reduce
Array.prototype.reduceRight
 
我將挑選5種方法,我個人認為是最有用的,很多開發者都會碰到。
 

1) indexOf

 
indexOf()方法返回在該數組中第一個找到的元素位置,如果它不存在則返回-1。
 
不使用indexOf時
 
var arr = ['apple','orange','pear'],
found = false;
 
for(var i= 0, l = arr.length; i< l; i++){
if(arr[i] === 'orange'){
found = true;
}
}
 
console.log("found:",found);
 
使用后
 
var arr = ['apple','orange','pear'];
 
console.log("found:", arr.indexOf("orange") != -1);
 

2) filter

 
該filter()方法創建一個新的匹配過濾條件的數組。
 
不用 filter() 時
 
var arr = [
    {"name":"apple", "count": 2},
    {"name":"orange", "count": 5},
    {"name":"pear", "count": 3},
    {"name":"orange", "count": 16},
];
    
var newArr = [];
 
for(var i= 0, l = arr.length; i< l; i++){
    if(arr[i].name === "orange" ){
newArr.push(arr[i]);
}
}
 
console.log("Filter results:",newArr);
 
 
用了 filter():
 
var arr = [
    {"name":"apple", "count": 2},
    {"name":"orange", "count": 5},
    {"name":"pear", "count": 3},
    {"name":"orange", "count": 16},
];
    
var newArr = arr.filter(function(item){
    return item.name === "orange";
});
 
 
console.log("Filter results:",newArr);
 
 

3) forEach()

 
forEach為每個元素執行對應的方法
 
var arr = [1,2,3,4,5,6,7,8];
 
// Uses the usual "for" loop to iterate
for(var i= 0, l = arr.length; i< l; i++){
console.log(arr[i]);
}
 
console.log("========================");
 
//Uses forEach to iterate
arr.forEach(function(item,index){
console.log(item);
});
 
forEach是用來替換for循環的
 
 

4) map()

 
map()對數組的每個元素進行一定操作(映射)后,會返回一個新的數組,
 
不使用map
 
var oldArr = [{first_name:"Colin",last_name:"Toh"},{first_name:"Addy",last_name:"Osmani"},{first_name:"Yehuda",last_name:"Katz"}];
 
function getNewArr(){
    
    var newArr = [];
    
    for(var i= 0, l = oldArr.length; i< l; i++){
        var item = oldArr[i];
        item.full_name = [item.first_name,item.last_name].join(" ");
        newArr[i] = item;
    }
    
    return newArr;
}
 
console.log(getNewArr());
 
使用map后
 
var oldArr = [{first_name:"Colin",last_name:"Toh"},{first_name:"Addy",last_name:"Osmani"},{first_name:"Yehuda",last_name:"Katz"}];
 
function getNewArr(){
        
    return oldArr.map(function(item,index){
        item.full_name = [item.first_name,item.last_name].join(" ");
        return item;
    });
    
}
 
console.log(getNewArr());
 
 
map()是處理服務器返回數據時是一個非常實用的函數。
 
 

5) reduce()

 
reduce()可以實現一個累加器的功能,將數組的每個值(從左到右)將其降低到一個值。
 
說實話剛開始理解這句話有點難度,它太抽象了。
 
場景: 統計一個數組中有多少個不重復的單詞
 
不使用reduce時
 
var arr = ["apple","orange","apple","orange","pear","orange"];
 
function getWordCnt(){
    var obj = {};
    
    for(var i= 0, l = arr.length; i< l; i++){
        var item = arr[i];
        obj[item] = (obj[item] +1 ) || 1;
    }
    
    return obj;
}
 
console.log(getWordCnt());
 
 
使用reduce()后
 
var arr = ["apple","orange","apple","orange","pear","orange"];
 
function getWordCnt(){
    return arr.reduce(function(prev,next){
        prev[next] = (prev[next] + 1) || 1;
        return prev;
    },{});
}
 
console.log(getWordCnt());
 
 
讓我先解釋一下我自己對reduce的理解。reduce(callback, initialValue)會傳入兩個變量。回調函數(callback)和初始值(initialValue)。假設函數它有個傳入參數,prev和next,index和array。prev和next你是必須要了解的。
 
一般來講prev是從數組中第一個元素開始的,next是第二個元素。但是當你傳入初始值(initialValue)后,第一個prev將是initivalValue,next將是數組中的第一個元素。
 
比如:
 
/*
* 二者的區別,在console中運行一下即可知曉
*/
 
var arr = ["apple","orange"];
 
function noPassValue(){
    return arr.reduce(function(prev,next){
        console.log("prev:",prev);
        console.log("next:",next);
        
        return prev + " " +next;
    });
}
function passValue(){
    return arr.reduce(function(prev,next){
        console.log("prev:",prev);
        console.log("next:",next);
        
        prev[next] = 1;
        return prev;
    },{});
}
 
console.log("No Additional parameter:",noPassValue());
console.log("----------------");
console.log("With {} as an additional parameter:",passValue());


免責聲明!

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



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