數(shù)組常用的遍歷方法
這幾個方法都不會改變原數(shù)組。這些方法只有在實際應(yīng)用中才能體會到它們的強大作用塑娇,這里只是羅列它們的一些知識點屹堰。
forEach() IE6-8不兼容
- 用來遍歷數(shù)組中的每一項;
- 參數(shù)
- 1.回調(diào)函數(shù) forEach(function(item,index,list))
- 2.上下文(改變回調(diào)函數(shù)中的this指向)
- 返回值:沒有
- 原有數(shù)組不會改變
理論上是沒有返回值的,僅僅是對數(shù)組進行遍歷刽宪,不會改變數(shù)組。但是可以通過索引來改變原有的值
無法直接退出循環(huán)界酒,只能使用return來達到for循環(huán)中continue的效果圣拄。
回掉函數(shù)中的作用
會傳遞三個參數(shù)
- item 數(shù)組中的當前項
- index 當前項的索引index
- 原始數(shù)組 input
執(zhí)行次數(shù)
- 數(shù)組中有幾項,那么傳遞進去的匿名回調(diào)函數(shù)就會執(zhí)行幾次
map() IE6-8不兼容
和forEach非常類似毁欣,但是map的回調(diào)函數(shù)中支持返回值:return的是啥庇谆,相當于把數(shù)組中的這一項變?yōu)樯?/p>
- 該方法就支持返回值了∑敬可以理解為map是映射的關(guān)系饭耳,將一個數(shù)組中的每一項做一個轉(zhuǎn)換,結(jié)果生成一個新數(shù)組执解,并且新數(shù)組的長度和原數(shù)組一樣
- 該方法可以應(yīng)用于改變原數(shù)組中的某一項寞肖,通過條件判斷替換掉原有項
- 被替換的那一項,不一定是原來的數(shù)據(jù)類型衰腌⌒麦。可以隨意替換已有的數(shù)據(jù)類型。
- 例如:將后臺傳遞過來的數(shù)據(jù)右蕊,生成HTML結(jié)構(gòu)琼稻,這時就可以舍棄字符串拼接∪那簦可以直接運用該方法帕翻,就每一項數(shù)據(jù)映射成一條HTML語句。
- 在回調(diào)函數(shù)中坯约,如果沒有返回值熊咽,則得到的是undefined
- 用法
var num = 3;
var obj = {name:100};
var arr = [{name:1},{name:3},{name:2},{name:3}];
var newArr = arr.map(function (item,index) {//返回成一個新的數(shù)組
if(item.name == num){ //如果當前項找到了,將最新的對象返回替換掉原有的
return obj;
}
return item;
});
filter() 過濾 ES5
該方法可以看作是過濾闹丐,按照某規(guī)則提取出一些特定的項來横殴,生成一個新數(shù)組,但新數(shù)組的長度小于或等于原數(shù)組
- callback將數(shù)組元素當參數(shù)傳入卿拴,并返回一個布爾值衫仑。當返回值為真時,該元素被假如到新的數(shù)組中堕花,否則就被過濾掉文狱,不會出現(xiàn)在新數(shù)組中。常用來當作刪除使用缘挽。
- 瞄崇,根據(jù)已知的條件呻粹,把與已知條件相關(guān)的數(shù)據(jù)進行處理。在遍歷過程中苏研,如果找到與已知條件相符合的數(shù)據(jù)等浊,返回true 就是保留該數(shù)據(jù);返回false就是刪除數(shù)據(jù)摹蘑。執(zhí)行完該方法后筹燕,會返回一個新的數(shù)組,不改變原數(shù)組衅鹿。
- 用法
var num = 3;
var arr = [{name:1},{name:3},{name:2},{name:3}];
//filter 過濾 如果在filter函數(shù)中返回true表示保留撒踪,返回false刪除,
var newArr = arr.filter(function (item,index) {
return item.name != num;
});
//會返回一個新的數(shù)組
find() 查找 ES6
find方法對數(shù)組中的每一項元素執(zhí)行一次callback函數(shù)大渤,直到有一個callback返回true制妄,就會停止執(zhí)行。意味著兼犯,只要找到符合條件的那一項忍捡,返回true。并把這一項的值返回切黔。就不再查找了
- 該方法可以用來對一組數(shù)據(jù)中具有某個屬性值砸脊,進行判斷。如果整個數(shù)組有這個屬性值纬霞,將要做什么凌埂。只要有一個不是,又要做什么诗芜。例如瞳抓,購物車中的全選和非全選,只要有一個沒有被選中伏恐,全選的checkbox就不能打√孩哑,如果全都選中,就打上√
- 用法
//查詢(find) findOne 查到一項后返回當前項 不繼續(xù)查找
var num = 3;
var arr = [{name:1},{name:3,age:100},{name:2},{name:3}];
//返回找到的那一項
var obj = arr.find(function (item,index) {
//找到后返回true即可
if(item.name ==num){
return true;//返回true則會將當前item返回
}
});
findIndex()es6
和find方法一樣翠桦,只是返回不一樣横蜒,find返回的當前符合條件的元素,而findIndex返回的是符合條件的元素的索引销凑。
every()方法
方法使用傳入的函數(shù)測試所有的元素丛晌,只要其中有一個函數(shù)返回值為false,那么該方法的結(jié)果為false;如果全部返回true斗幼,那么該方法的結(jié)果才為true.
some()方法
與every()方法正好相反澎蛛,some測試數(shù)組元素時,只要有一個函數(shù)返回值為true蜕窿,則該方法返回true谋逻,若全部返回false,則該方法返回false呆馁。
reduce()方法
reduce()方法接受一個方法作為累加器,數(shù)組中的每一值(從左到右)開始合并毁兆,最終為一個值
語法:arr.reduce(fn, initialValue)
fn 表示在數(shù)組每一項上執(zhí)行的函數(shù)智哀,接受四個參數(shù):
- previousValue上一次調(diào)用回調(diào)返回的值,或者提供的初始值荧恍;
- value數(shù)組中當前被處理元素的值
- index當前元素在數(shù)組中的索引
- array原數(shù)組
initialValue指定第一次調(diào)用fn的第一個參數(shù)。
當fn第一次執(zhí)行時:
- 如果initialValue在調(diào)用reduce時被提供屯吊,那么第一個previousValue將等于initalValue,此時item等于數(shù)組中的第一值送巡;
- 如果initailValue未提供,那么previousValue等于數(shù)組中的第一個值盒卸,item等于數(shù)組中的第二個值骗爆。此時如果數(shù)組為空,那么將拋出TypeError
- 如果數(shù)組僅一個元素蔽介,并且沒有提供viitalValue摘投,或提供了initialValue但數(shù)組為空,那么fn不會被執(zhí)行虹蓄,數(shù)組的唯一值將被返回
var ary = [3,4,5,6];
var res = ary.reduce(function (pre,value,index,array) {
return pre+value
},1);
console.log(res);// 19
const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck', 'pogostick'];
const transportation = data.reduce(function(obj, item) {
if (!obj[item]) {
obj[item] = 0;
}
obj[item]++;
return obj;
}, {});
console.log(transportation);
reduceRight
與reduce一致犀呼,只是累加的方向該為從右往左累加
entries(ES6)
返回一個數(shù)組迭代器對象,該對象包含數(shù)組中每個索引的鍵值對薇组;
語法:arr.entries()
var ary = [1,2,3,4,5];
var res = ary.entries();
console.log(res.next()); // { value: [ 0, 1 ], done: false }
console.log(res.next().value);// [ 1, 2 ]
keys(ES6)
返回一個數(shù)組索引的迭代器外臂,類似于entries,只是返回的都是索引律胀。