數(shù)組的高階函數(shù):map,reduce,filter,sort

map

function pow(x){
   return x*x;
}
var arr=[1,2,3,4,5,6,7,8];
var result = arr.map(pow);
console.log(result);//[1,2,9,16,25,36,49,64]

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce
Array的reduce()把一個(gè)函數(shù)作用在這個(gè)Array的[x1,x2,x3,x4,...]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce()把結(jié)果繼續(xù)和序列的下一個(gè)元素做累計(jì)計(jì)算,其效果就還是

[x1,x2,x3,x4].reduce(f) = f(f(f(x1,x2),x3),x4)

比如說(shuō)對(duì)一個(gè)Array求和,就可以用reduce實(shí)現(xiàn):

var arr = [1,3,5,7,9];
arr.reduce(function(x,y){
    return x+y;
})

filter
filter也是一個(gè)常用的操作,它用于把Array的某些元素過(guò)濾掉,然后返回剩下的元素。filter接收一個(gè)函數(shù),把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是true還是false決定保留還是丟棄該元素。

在一個(gè)Array中,刪掉偶數(shù),只保留奇數(shù),可以這么寫(xiě)
var arr=[1,2,3,4,5,6,7,8];
var r = arr.filter(function(x){
   return x%2!==0;
})
r;//[[1, 3, 5, 7]]

把一個(gè)Array中空字符串刪掉,

var arr=['A','B','',null,undefined,'C',''];
var r = arr.filter(function(s){
   return s && s.trim();
})
r;//'A', 'B', 'C']

filter()接收的回調(diào)函數(shù),其實(shí)可以有多個(gè)參數(shù),通常我們僅使用第一個(gè)參數(shù),表示Array的某個(gè)元素?;卣{(diào)函數(shù)還可以接收另外兩個(gè)參數(shù),表示元素的位置和數(shù)組本身:

var arr = ['A','B','CD'];
var r = arr.filter(function(element,index,self){
    console.log(element);
    console.log(index);
    console.log(self);
})

利用filter可以巧妙地去除Array的重復(fù)元素:

var r,
arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
r=arr.filter(function(element,index,self){
   return self.indexOf(element) === index;
})

sort
sort()方法就是用于排序,但是排序結(jié)果

// 看上去正常的結(jié)果:
['Google', 'Apple', ].sort(); // ['Apple', 'Google'];
// apple排在了最后:
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']
// 無(wú)法理解的結(jié)果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

這是因?yàn)閟ort()方法默認(rèn)把所有元素轉(zhuǎn)換為String再排序,結(jié)果'10'在 '2'前面,因?yàn)樽址?1'比'2'的ASCII碼小
幸運(yùn)的是,sort()方法也是一個(gè)高階函數(shù),它還可以接收一個(gè)比較函數(shù)來(lái)實(shí)現(xiàn)自定義的排序。

var arr=[10,20,1,2];
arr.sort(function(x,y){
   if(x<y){
      return -1;
   }
   if(x>y){
      return 1;
   }
   return 0;
});
console.log(arr);//[1,2,10,20]

默認(rèn)情況下,對(duì)字符串排序,是按照ASCII的大小比較的,現(xiàn)在,我們提出排序應(yīng)該忽略大小寫(xiě),按照字母序排序。要實(shí)現(xiàn)這個(gè)算法,不必對(duì)現(xiàn)有代碼大加改動(dòng),只要我們能定義出忽略大小寫(xiě)的比較算法就可以:

var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
    x1 = s1.toUpperCase();
    x2 = s2.toUpperCase();
    if (x1 < x2) {
        return -1;
    }
    if (x1 > x2) {
        return 1;
    }
    return 0;
}); // ['apple', 'Google', 'Microsoft']

提示:sort()方法會(huì)直接對(duì)Array進(jìn)行修改,他返回的結(jié)果仍然是當(dāng)前Array:

var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是同一對(duì)象

every
every()方法可以判斷數(shù)組的所有元素是否滿足測(cè)試條件
例如,給定一個(gè)包含若干字符串的數(shù)組,判斷所有字符串是否滿足指定的測(cè)試條件:

 var arr = ['Apple', 'pear', 'orange'];
console.log(arr.every(function(s){
   return s.length>0; 
}));//true 每個(gè)元素都滿足s.length>0
console.log(arr.every(function(s){
   return s.toLowerCase() === s;
}));//false   不是每個(gè)元素都全部是小寫(xiě)

find
find()方法用于查找符合條件的第一個(gè)元素,如果找到了,返回這個(gè)元素,否則,返回undefined

 var arr = ['Apple', 'pear', 'orange'];
console.log(arr.find(function (s) {
    return s.toLowerCase() === s;
})); // 'pear', 因?yàn)閜ear全部是小寫(xiě)

console.log(arr.find(function (s) {
    return s.toUpperCase() === s;
})); // undefined, 因?yàn)闆](méi)有全部是大寫(xiě)的元素

findIndex
findIndex()和finde()類似,也是查找符合條件的第一個(gè)元素,不同之處在于findIndex()會(huì)返回這個(gè)元素的索引,如果沒(méi)有找到,返回-1;

var arr = ['Apple', 'pear', 'orange'];
console.log(arr.findIndex(function (s) {
    return s.toLowerCase() === s;
})); // 1, 因?yàn)?pear'的索引是1

console.log(arr.findIndex(function (s) {
    return s.toUpperCase() === s;
})); // -1

forEach
forEach()和map()類似,它爸每個(gè)元素依次作用于傳入的函數(shù),但不會(huì)返回新數(shù)組,forEach常用于遍歷數(shù)組,因此,傳入的函數(shù)不需要返回值:

var arr = ['Apple', 'pear', 'orange'];
arr.forEach(console.log); // 依次打印每個(gè)元素
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容