摘要:場景檢查數(shù)組中是否含有某個東西和是對立的案例案例是否包含為對象循環(huán)遍歷效率對比參考參考原生實現(xiàn)等方法其他參考
1 遍歷數(shù)組的方法
1-1、for / while
最普通的循環(huán) 效率最高 兼容ie6
tips:for循環(huán)更適用于循環(huán)的開始和結(jié)束已知,循環(huán)次數(shù)固定的場合;while循環(huán)更適合于條件不確定的場合
1-2、for in
兼容ie6,效率最差(效率可看最下面的對比) for in 會把繼承鏈的對象屬性都會遍歷一遍,所以會更花時間.
var arr = ["red", "green", "blue"]; var obj = { name:"張三", age:20 } for(k in obj){ console.log(k); //name , age console.log(obj[k]); // 張三 , 20 } for(k in arr){ console.log(k); // 0 , 1 ,2 console.log(arr[k]); // red, green ,blue }
1-3、for of ?es6語法
ie不兼容 ?【for-of 語句只遍歷可迭代對象的數(shù)據(jù)。】原生具備 Iterator 接口的數(shù)據(jù)結(jié)構(gòu)如下。ArrayMapSetStringTypedArray函數(shù)的 arguments 對象NodeList 對象更多迭代器 閱讀:http://es6.ruanyifeng.com/#do...
var arr = ["red", "green", "blue"]; for(var v of arr) { console.log(v); // red green blue }
區(qū)別:for of 和 for in的區(qū)別for-in 語句以原始插入順序迭代對象的可枚舉屬性。for-in會把繼承鏈的對象屬性都會遍歷一遍,所以會更花時間.
2、數(shù)組自帶的循環(huán)方法:every 、 filter、forEach、map、reduce、some 都是兼容ie9
map,filter 是返回新的數(shù)組 (形象區(qū)分幾個循環(huán)方法的區(qū)別參考:https://www.zhihu.com/questio...)
2-1、Array.prototype.every()
方法說明:測試數(shù)組的所有元素是否都通過了指定函數(shù)的測試。 遇到有不滿足的會提前終止整個循環(huán)
場景:檢測每一項的selected字段都是被選中為true
案例:
var arr = [ {id:1,name:"zhangsan1",selected:false}, {id:2,name:"zhangsan2",selected:false}, {id:3,name:"zhangsan3",selected:true}, ]; var reslut = arr.every(function(el,index,arr){ console.log(el); return el.selected==true; }); console.log(reslut); //false
2-2、Array.prototype.filter() ?
方法說明: 將所有在過濾函數(shù)中返回 true 的數(shù)組元素放進一個新數(shù)組中并返回。true表示保留該元素(通過測試),false則不保留
場景:在一個數(shù)組中篩選數(shù)字大于10的元素,組成一個新數(shù)組
案例:
var arr = [ 10,20,30 ]; var arr1 = arr.filter(function(el,index,arr){ return el > 10; }); console.log(arr1); // 20 30
2-3、Array.prototype.forEach()
?
方法說明:方法對數(shù)組的每個元素執(zhí)行一次提供的函數(shù) ? ?沒有辦法中止或者跳出 forEach 循環(huán),除了拋出一個異常。 如果您正在測試一個數(shù)組里的元素是否符合某條件,且需要返回一個布爾值,那么可使用 Array.every 或 Array.some。如果可用,新方法 find() 或者findIndex() 也可被用于真值測試的提早終止。
場景: 普通遍歷
案例:
var arr = [ {id:1,name:"zhangsan1",selected:false}, {id:2,name:"zhangsan2",selected:false}, {id:3,name:"zhangsan3",selected:true}, ]; arr.forEach(function(el,index,arr){ console.log(el) });
2-4、Array.prototype.map()
方法說明:方法創(chuàng)建一個新數(shù)組,其結(jié)果是該數(shù)組中的每個元素都調(diào)用一個提供的函數(shù)后返回的結(jié)果。
場景:異步得到數(shù)據(jù)后,需要新建一個數(shù)據(jù)根據(jù)id標識記錄是否被選中的selected屬性
案例:
var arr = [ {id:1,name:"zhangsan1"}, ]; var arr1 = arr.map(function(el,index,arr){ var newObj = {}; newObj.id = el.id; newObj.selected = false; return newObj; }); console.log(arr); // [{id:1,name:"zhangsan1"}] console.log(arr1); // [{id:1,selected:false}]
案例2: es6寫法
var numbers = [1, 5, 10, 15]; var doubles = numbers.map( x => x ** 2); //[2,10,20,30]
案例3:重格式化數(shù)組 //不改變原數(shù)組
var kvArray = [{key: 1, value: 10}, {key: 2, value: 20}, {key: 3, value: 30}]; var reformattedArray = kvArray.map(function(obj) { var rObj = {}; rObj[obj.key] = obj.value; return rObj; }); // reformattedArray 數(shù)組為: [{1: 10}, {2: 20}, {3: 30}],
2-5、Array.prototype.reduce()
方法說明:方法對累加器和數(shù)組中的每個元素(從左到右)應(yīng)用一個函數(shù),將其減少為單個值。
場景:累加 、 合并多個數(shù)組
案例:
var total = [0, 1, 2, 3].reduce(function(sum, value) { return sum + value; }, 0); // total is 6 var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); }, []); // flattened is [0, 1, 2, 3, 4, 5]
2-6、Array.prototype.some()
方法說明:方法測試數(shù)組中的某些元素是否通過由提供的函數(shù)實現(xiàn)的測試。
場景:檢查數(shù)組中是否含有某個東西 (和every 是對立的)
案例:
const isBiggerThan10 = (element, index, array) => { return element > 10; } [2, 5, 8, 1, 4].some(isBiggerThan10); // false [12, 5, 8, 1, 4].some(isBiggerThan10); // true
案例2: 是否包含id為1 對象
var arr = [ {id:1,name:"zhangsan1"}, {id:2,name:"zhangsan2"}, ]; var flag = arr.some(function(element, index, array){ console.log(element.id) return element.id == 1; }); console.log(flag)3、 循環(huán)/遍歷效率對比
for ~= do while < forEach ~= map ~= every < $.each < $(e).each < for in ?
參考:http://www.jb51.net/article/1...
for > for-of > forEach > filter > map > for-in
參考:https://dailc.github.io/2016/...
?http://www.jb51.net/article/6...
5、其他參考https://juejin.im/post/5a3a59...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101739.html
摘要:循環(huán)方法方法不改變原數(shù)組方法會給原數(shù)組中的每個元素都按順序調(diào)用一次函數(shù)。篩選出過濾出數(shù)組中符合條件的項組成新數(shù)組代碼方法方法為數(shù)組中的每個元素執(zhí)行一次函數(shù),直到它找到一個使返回表示可轉(zhuǎn)換為布爾值的值的元素。 showImg(https://segmentfault.com/img/bV2QTD?w=1600&h=500); 前言 JavaScript 發(fā)展至今已經(jīng)發(fā)展出多種數(shù)組的循環(huán)遍...
摘要:所以結(jié)果的不同就是后者能將循環(huán)內(nèi)容至少執(zhí)行一次。當此語句省略時,表示不進行條件判斷,循環(huán)將一直執(zhí)行,只有在循環(huán)中使用來跳出循環(huán)。支持對數(shù)組和類數(shù)組對象進行循環(huán),不支持普通對象的循環(huán)。支持對字符串進行循環(huán)遍歷。 JavaScript中直接提供的循環(huán),主要有以下幾種 while 循環(huán) 和其他語言一樣,JavaScript中的while循環(huán)有兩種形式: while (condition) {...
本篇有7k+字, 系統(tǒng)梳理了js中常見的12種排序算法。除了基本排序算法,文章還包含了希爾排序、堆排序、桶排序等較為復(fù)雜的排序?qū)崿F(xiàn),如果喜歡請點贊支持~謝謝. 原文: http://louiszhai.github.io/20... 導(dǎo)讀 排序算法可以稱得上是我的盲點, 曾幾何時當我知道Chrome的Array.prototype.sort使用了快速排序時, 我的內(nèi)心是奔潰的(啥是快排, 我只知道...
摘要:知識體系梳理流程圖一維數(shù)組數(shù)組概述數(shù)組是指一組數(shù)據(jù)的集合,數(shù)組中的每個數(shù)據(jù)被稱作元素。定義打印數(shù)組元素方法按照給定的格式打印題目分析通過觀察發(fā)現(xiàn),要實現(xiàn)按照指定格式,打印數(shù)組元素操作。按照這種方式,數(shù)組循環(huán)多圈以后,就完成了數(shù)組元素的排序。 知識體系梳理流程圖 showImg(https://segmentfault.com/img/bVXwAi?w=902&h=652); 一維數(shù)組 ...
摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)。快速隨機訪問就是通過元素的序號快速獲取元素對象對應(yīng)于方法。而接口就是用來標識該類支持快速隨機訪問。僅僅是起標識作用。,中文名為雙端隊列。不同的是,是線程安全的,內(nèi)部使用了進行同步。 前言 學習情況記錄 時間:week 2 SMART子目標 :Java 容器 記錄在學習Java容器 知識點中,關(guān)于List的需要重點記錄的知識點。...
閱讀 4221·2021-11-22 09:34
閱讀 1650·2021-11-04 16:10
閱讀 1824·2021-10-11 10:59
閱讀 3347·2019-08-30 15:44
閱讀 2127·2019-08-30 13:17
閱讀 3565·2019-08-30 11:05
閱讀 821·2019-08-29 14:02
閱讀 2697·2019-08-26 13:34