深入瞭解JavaScript 中的For循環之詳解

JavaScript 循環. 如果您希望一遍又一遍地運行相同的代碼,並且每次的值都不同,那麼使用循環是很方便的。 我們可以這樣輸出數組的值,循環提供了一種快速和簡單的方式去做一些重複的事。JavaScript入門的這個章節會介紹在JavaScript中存在哪些不同的迭代語句,常用的循環遍歷方法for()循環forEachmap()for..infor..ofjquery:$.each()forEach() & map()forEach(),map()是es5新增的循環遍歷方法。

前言:

​ 今天我想分享一個有關於循環篩選的知識點,也許是前端小白的你首先想到的是用for循環做篩選,但我這種小菜鳥想到的就是map(工作中很喜歡用= =),學過數據結構的小夥伴也肯定知道,線性表這些跟循環也息息相關,包括你出去面試的時候或許你遇到過這樣的問題,map和forEach的區別?去重的幾種方式?說實話,forEach我真的很少用,但不滿足於現狀的我,覺得應該多學習幾種。我是前端挖坑妹,準備好了麼?一起粗發~

正文:

​ 在代碼示例中我會用到es6中的語言,如果你還不是很瞭解,你可以看看阮老師的es6.(= =我也是一點一點跟着看的。)

1.map

​ 先說一下最常用的map.利用map方便獲得對象數組中的特定屬性值們.它返回一個新數組,數組中的元素爲原始數組元素調用函數處理後的值。

//將a02品牌的標價全部加100
const clothesArr=[
  {username:"sunan",haveA02:false,basePrice:30},
  {username:"fenshuajiang",haveA02:true,basePrice:10},
  {username:"huixin",haveA02:true,basePrice:20}
]//蘇南的專欄 交流:912594095、公衆號:honeyBadger8

clothesArr.map(
	item=>item.haveA02?{...item,basePrice:item.basePrice+100:item}
)
  • map() 不會對空數組進行檢測。

  • map() 不會改變原始數組。

2.filter

​ filter和map相比,它也接受一個函數,並把接受的函數依次作用於每個元素,返回值爲true和false,true留下,false扔掉!看看例子~

const filterArr = [1,2,3,4,5,6,7,8,9,10];//這裏我只想要3的倍數

const newArr = filterArr.filter((x) => x % 3 == 0);

console.log(newArr);//(3) [3, 6, 9]

這裏需要注意:

  • filter() 不會對空數組進行檢測。

  • filter() 不會改變原始數組,所以你需要賦值到新數組上。

3.forEach

forEach() 方法用於調用數組的每個元素,並將元素傳遞給回調函數。forEach方法中的function回調有三個參數:第一個參數是遍歷的數組內容,第二個參數是對應的數組索引,第三個參數是數組本身,數組中有幾項,那麼傳遞進去的匿名回調函數就需要執行幾次.

const forEachArr=[1,2,3,4,5];//計算所有數組的和
var sum=0;
forEachArr.forEach((value,index,array)=>{
    sum+=value;  
    });//蘇南的專欄 交流:912594095、公衆號:honeyBadger8
console.log(sum);//15

這裏需要注意:

  • forEach() 對於空數組是不會執行回調函數的。
4.for in

以前覺得這個不常用,但現在真的很感謝有這個函數,因爲最近項目中解決了很多問題,尤其是對象拿value值的時候,先來說說對數組的時候怎麼用。

const forInArr=[1,2,3,4,5]
for(let index in forInArr){
    console.log(index,forInArr[index]);
}
//0 1
//1 2
//2 3
//3 4
//4 5

用for in不僅可以對數組便利,也可以對enumerable(可枚舉)對象操作

const forInObj={
  '111':{name:'huixin',size:'m'},
  '222':{name:'sunan',size:'l'},
  '333':{name:'fenshuajiang',size:'s'}
};//這個時候我只想取到value值傳給後端,key值不要。
for(let index in forInObj){
    console.log(index,forInObj[index]);
}
//111 {name: "huixin", size: "m"}
//222 {name: "sunan", size: "l"}
//333 {name: "fenshuajiang", size: "s"}

在這裏插播一個問題:給你一個對象,去掉裏面屬性值爲null、""或者undefined的屬性

let objs={
  a:false,
  b:null,
  c:undefined,
  d:''
}

const dataType=(obj)=>{
    if (obj===null) return "Null";
    if (obj===undefined) return "Undefined";
    return Object.prototype.toString.call(obj).slice(8,-1);
};

const filtrateValue=(obj)=>{
    var param = {};
    if ( obj === null || obj === undefined || obj === "" ) return param;
    for ( var key in obj ){
        if ( dataType(obj[key]) === "Object" ){
            param[key] = filtrateValue(obj[key]);
        }else if(  obj[key] !== null && obj[key] !== undefined && obj[key] !== ""  ){//蘇南的專欄 交流:912594095、公衆號:honeyBadger8
            param[key] = obj[key];
        }
    }
    return param;
};
filtrateValue(objs);

//{a: false}
5.for of

在es6 中新增了一個 for of 循環,這個還沒怎麼用過,以後要多用才能記得住,看看例子~

const forOfArr='huixin';
for(let value of forOfArr) {  
        console.log(value);  
};
//h
//u
//i
//x
//i
//n

for in總是得到對像的key或數組,字符串的下標,而for of和forEach一樣,是直接得到值

注意:for of不能對對象用

6.set

Set類似於數組,但是成員的值都是唯一的,沒有重複的值,也沒有索引。用set.size表示僞數組長度

var setArr= [7, 7, 7, 8, 8, 8, 82, 82, 839, 49, 329, 8, 3, 3];//數組去重
var set = new Set(setArr);
var newArr = new Array(...set);
console.log(newArr);//(7) [7, 8, 82, 839, 49, 329, 3]
7.some

這個函數,我覺得只是檢測數組中是否有某個元素,符合條件,符合返回true。如果沒有滿足條件的元素,則返回false。感覺有點像|字符。

var someArr = [2, 13, 18, 20];//檢測是否有人小於18歲
let outcome=someArr.some( (age)=>{ return age<18})
console.log(outcome);//true

注意: some() 不會對空數組進行檢測。

注意: some() 不會改變原始數組。

8.every

這個函數,檢測數組中是否有某個元素,不符合條件,有一個爲false,則返回false。如果都滿足條件的元素,則返回true。感覺有點像&字符。

var someArr = [2, 13, 18, 20];//檢測是否都是未成年
let outcome=someArr.every((age)=>{ return age<18})
console.log(outcome);//false

注意: every() 不會對空數組進行檢測。

注意: every() 不會改變原始數組。

9.reduce

​ 最後一個,reduce,剛接觸前端的時候,我也不明白,現在到是知道那麼一丟丟了。這個方法有點不同,4個參數。接收一個函數作爲累加器,數組中的每個值(從左到右)開始縮減,最終計算爲一個值。

​ prev:它是上一次調用回調時返回的結果,每次調用的結果都會給prev

​ cur:當前的元素

​ index:當前的索引

​ arr:循環的數組

var reduceArr = [1,2,3,4,5]//求和
 
var str = reduceArr.reduce((prev,cur,index,arr)=>{
	return prev + cur ;//蘇南的專欄 交流:912594095、公衆號:honeyBadger8
})

console.log(str);//15

10.Object.keys(obj)

朋友小機靈又幫我添加了一個,可以遍歷對象

const forInObj={
  '111':{name:'huixin',size:'m'},
  '222':{name:'sunan',size:'l'},
  '333':{name:'fenshuajiang',size:'s'}
};//蘇南的專欄 交流:912594095、公衆號:honeyBadger8
Object.keys(forInObj).map(item=>console.log(item,forInObj[item]));

//111 {name: "huixin", size: "m"}
//222 {name: "sunan", size: "l"}
//333 {name: "fenshuajiang", size: "s"}

總結

學了這麼多,不一定強制我在工作中一定要用到,玩的順手就好,畢竟每天進步一點點,心裏才踏實,哈哈。我是前端挖坑妹,一個每天給自己挖坑的妹子,下次見哈~

IT平頭哥聯盟主要分享前端、測試 等領域的積累(前端開發、HTML、CSS/CSS3、新手上路、javascript、js、自動化、性能、接口系列),蘇南,首席填坑官,平頭哥,蜜獾,個人博客——寶劍鋒從磨礪出 梅花香自苦寒來,曾想仗劍走天涯 後來BUG太多就沒去了,蘇南的專欄

其他

作者:前端挖坑妹

鏈接:http://susouth.com/

交流:912594095、公衆號:honeyBadger8

本文原創,著作權歸作者所有。商業轉載請聯繫@IT·平頭哥聯盟獲得授權,非商業轉載請註明原鏈接及出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章