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è)元素