JS數組遍歷的幾種方法

  1. for
    ??最簡單的一種循環(huán)遍歷方法区匠,也是使用頻率最高的一種尖昏,可優(yōu)化
var arr = [1, 2, 3, 4, 5, 6]
for(var i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
// 1 2 3 4 5 6

優(yōu)化:使用臨時變量,將長度緩存起來掖肋,避免重復獲取數組長度,當數組較大時優(yōu)化效果才會比較明顯

var arr = [1, 2, 3, 4, 5, 6]
var len = arr.length
for(var i = 0; i < len; i++) {
    console.log(arr[i])
}
// 1 2 3 4 5 6
  1. for…in…
    ??效率最低(輸出的 key 是數組索引)
var arr = ['蘋果', '橘子', '香蕉', '葡萄', '草莓', '芒果']
for(var key in arr) {
    console.log(key)
}

// 0 1 2 3 4 5
  1. for…of…(ES6)
    ??性能要好于 for…in…赏参,但仍然比不上普通的 for 循環(huán)(不能循環(huán)對象)
var arr = ['蘋果', '橘子', '香蕉', '葡萄', '草莓', '芒果']
for(var key of arr) {
    console.log(key)
}
// 蘋果 橘子 香蕉 葡萄 草莓 芒果
  1. forEach(ES6)
    ????數組里的元素個數有幾個,該方法里的回調就會執(zhí)行幾次
    ????第一個參數是數組里的元素沿盅,第二個參數為數組里元素的索引把篓,第三個參數則是它自己
    ????數組自帶的遍歷方法,雖然使用頻率略高腰涧,但是性能仍然比普通循環(huán)略低
var arr = [1, 2, 3, 4, 5, 6]
arr.forEach(function (item, idnex, array) {
    console.log(item)     // 1 2 3 4 5 6
    console.log(array)    // [1, 2, 3, 4, 5, 6]
})
  1. map(ES6)
    ????遍歷每一個元素并且返回對應的元素(可以返回處理后的元素) (map 映射 一 一 對應)
    ????返回的新數組和舊數組的長度是一樣的
    ????使用比較廣泛韧掩,但其性能還不如 forEach
var arr = [1, 2, 3, 4, 5, 6]
var newArr = arr.map(function (item, idnex) {
    // 第一個參數是值 第二個參數是索引值
    return item * item
})

console.log(newArr)    // [1, 4, 9, 16, 25, 36]
// 要添加代碼塊 map 不可以解析同一個塊級作用域
// {}{}代表不同的塊級作用域 分別在不同里面寫

// 淺拷貝
// 淺拷貝是指a把值 給了b 當b的值改變 a b 的值同時改變。

let list = [
    { id: 23, title: "女裝1",price: 100},
    { id: 23, title: "女裝2",price: 200},
    { id: 23, title: "女裝3",price: 300}
]
let newArr = data.list.map((item, index) => {
     item.price = item.price * .6
     return item;
 });
console.log(newArr)//打印的結果價格都是改變的窖铡,一樣的
// {
    // 0: {id: 23, title: "女裝1", price: 60}
    // 1: {id: 24, title: "女裝2", price: 120}
    // 2: {id: 27, title: "女裝3", price: 180}
 // }
 console.log(data.list)//同上

// 深拷貝
// 深拷貝是指a b 的值無論哪個值改變 內存地址不同 互不干擾
// 深拷貝1

let newArr = list.map(item => {
  // es6箭頭函數疗锐,可以只寫一個參數
  // 使用深拷貝需要重新定義一個空的來接收改變的數據
  let newPrice = item.price * 0.6
  return {
    id: item.id,
    title: item.title,
    price: newPrice
  }
})
console.log(newArr) // price對應的數據發(fā)生改變坊谁,同上
console.log(list)  // 原數據不發(fā)生改變

// 深拷貝 2(簡單粗暴)

// JSON.stringify 把對象轉為字符串
// JSON.parse 把字符串轉化為對象
let newList = JSON.parse(JSON.stringify(list))
let newArr = newList.map(item => {
  item.price *= 0.6
  return item
})
console.log (newArr)  //同深拷貝1
console.log (list)  //同深拷貝1
  1. filter(ES6)
    ??遍歷數組,過濾出符合條件的元素并返回一個新數組
var arr = [
    { id: 1, name: '小明', done: true },
    { id: 2, name: '小華', done: true },
    { id: 3, name: '小紅', done: false }
]
    
var newArr = arr.filter(function (item, index) {
    return item.done
})

console.log(newArr)

// [{ id: 1, name: '小明', done: true },{ id: 2, name: '小華', done: true }]
  1. some(ES6)
    ??遍歷數組滑臊,只要有一個以上的元素滿足條件就返回 true口芍,否則返回 false
var arr = [
    { id: 1, name: '小明', done: true },
    { id: 2, name: '小華', done: true },
    { id: 3, name: '小紅', done: false }
]

var bool = arr.some(function (item, index) {
    return item.done
})

console.log(bool)    // true
  1. every(ES6)
    ??遍歷數組,每一個元素都滿足條件 則返回 true雇卷,否則返回 false
var arr = [
    { id: 1, name: '小明', done: true },
    { id: 2, name: '小華', done: true },
    { id: 3, name: '小紅', done: false }
]

var bool = arr.every(function (item, index) {
    return item.done
})

console.log(bool)    // false
  1. find(ES6)
    ??遍歷數組鬓椭,返回符合條件的第一個元素,如果沒有符合條件的元素則返回 undefined
var arr = [1, 1, 2, 2, 3, 3, 4, 5, 6]
    
var num = arr.find(function (item, index) {
    return item === 3
})

console.log(num)   //  3
  1. findIndex(ES6)
    ???遍歷數組关划,返回符合條件的第一個元素的索引小染,如果沒有符合條件的元素則返回 -1
var arr = [1, 1, 2, 2, 3, 3, 4, 5, 6]
    
var num = arr.findIndex(function (item) {
    return item === 3
})

console.log(num)   //  4
  1. reduce (ES6)
    用來實現累加的效果
    輸出的總和是 sum+val(數值)
// reduce 用來實現累加的效果 (常用于寫購物車價格的累加)
// 聲明一個數組 數組里面放數字 讓其里面的數字顯示為累加的總和
let arr=[200,200,100]
let result =arr.reduce((sum,val,index)=>{
  200+200 index 
  400+100 index
// sum是總加后的和 val是變量里面的值 index為索引值 
  console.log(sum,val,index)  
  // 200 200 1
  // 400 100 2
  return sum +val;
})
console.log(result)  // 500
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贮折,隨后出現的幾起案子裤翩,更是在濱河造成了極大的恐慌,老刑警劉巖调榄,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踊赠,死亡現場離奇詭異,居然都是意外死亡振峻,警方通過查閱死者的電腦和手機臼疫,發(fā)現死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扣孟,“玉大人烫堤,你說我怎么就攤上這事》锛郏” “怎么了鸽斟?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長利诺。 經常有香客問我富蓄,道長,這世上最難降的妖魔是什么慢逾? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任立倍,我火速辦了婚禮,結果婚禮上侣滩,老公的妹妹穿的比我還像新娘口注。我一直安慰自己,他們只是感情好君珠,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布寝志。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪材部。 梳的紋絲不亂的頭發(fā)上毫缆,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音乐导,去河邊找鬼苦丁。 笑死,一個胖子當著我的面吹牛兽叮,可吹牛的內容都是我干的芬骄。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼鹦聪,長吁一口氣:“原來是場噩夢啊……” “哼账阻!你這毒婦竟也來了?” 一聲冷哼從身側響起泽本,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤淘太,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后规丽,有當地人在樹林里發(fā)現了一具尸體蒲牧,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年赌莺,在試婚紗的時候發(fā)現自己被綠了冰抢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡艘狭,死狀恐怖挎扰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情巢音,我是刑警寧澤遵倦,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站官撼,受9級特大地震影響梧躺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜傲绣,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一掠哥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秃诵,春花似錦龙致、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗤练,卻和暖如春榛了,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煞抬。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工霜大, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人革答。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓战坤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親残拐。 傳聞我的和親對象是個殘疾皇子途茫,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容