成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)組常見的遍歷循環(huán)方法、數(shù)組的循環(huán)遍歷的效率對(duì)比

xfee / 2295人閱讀

摘要:場(chǎng)景檢查數(shù)組中是否含有某個(gè)東西和是對(duì)立的案例案例是否包含為對(duì)象循環(huán)遍歷效率對(duì)比參考參考原生實(shí)現(xiàn)等方法其他參考

1 遍歷數(shù)組的方法
1-1、for / while

最普通的循環(huán) 效率最高 兼容ie6
tips:for循環(huán)更適用于循環(huán)的開始和結(jié)束已知,循環(huán)次數(shù)固定的場(chǎng)合;while循環(huán)更適合于條件不確定的場(chǎng)合

1-2、for in

兼容ie6,效率最差(效率可看最下面的對(duì)比) for in 會(huì)把繼承鏈的對(duì)象屬性都會(huì)遍歷一遍,所以會(huì)更花時(shí)間.

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語(yǔ)法

ie不兼容 ?【for-of 語(yǔ)句只遍歷可迭代對(duì)象的數(shù)據(jù)?!吭邆?Iterator 接口的數(shù)據(jù)結(jié)構(gòu)如下。ArrayMapSetStringTypedArray函數(shù)的 arguments 對(duì)象NodeList 對(duì)象更多迭代器 閱讀: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 語(yǔ)句以原始插入順序迭代對(duì)象的可枚舉屬性。for-in會(huì)把繼承鏈的對(duì)象屬性都會(huì)遍歷一遍,所以會(huì)更花時(shí)間.

2、數(shù)組自帶的循環(huán)方法:

every 、 filter、forEach、map、reduce、some 都是兼容ie9
map,filter 是返回新的數(shù)組 (形象區(qū)分幾個(gè)循環(huán)方法的區(qū)別參考:https://www.zhihu.com/questio...)

2-1、Array.prototype.every()

方法說明:測(cè)試數(shù)組的所有元素是否都通過了指定函數(shù)的測(cè)試。 遇到有不滿足的會(huì)提前終止整個(gè)循環(huán)
場(chǎng)景:檢測(cè)每一項(xiàng)的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ù)組元素放進(jìn)一個(gè)新數(shù)組中并返回。true表示保留該元素(通過測(cè)試),false則不保留
場(chǎng)景:在一個(gè)數(shù)組中篩選數(shù)字大于10的元素,組成一個(gè)新數(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()
?
方法說明:方法對(duì)數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù) ? ?沒有辦法中止或者跳出 forEach 循環(huán),除了拋出一個(gè)異常。 如果您正在測(cè)試一個(gè)數(shù)組里的元素是否符合某條件,且需要返回一個(gè)布爾值,那么可使用 Array.every 或 Array.some。如果可用,新方法 find() 或者findIndex() 也可被用于真值測(cè)試的提早終止。
場(chǎng)景: 普通遍歷
案例:

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)建一個(gè)新數(shù)組,其結(jié)果是該數(shù)組中的每個(gè)元素都調(diào)用一個(gè)提供的函數(shù)后返回的結(jié)果。
場(chǎng)景:異步得到數(shù)據(jù)后,需要新建一個(gè)數(shù)據(jù)根據(jù)id標(biāo)識(shí)記錄是否被選中的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ù)組 //不改變?cè)瓟?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()

方法說明:方法對(duì)累加器和數(shù)組中的每個(gè)元素(從左到右)應(yīng)用一個(gè)函數(shù),將其減少為單個(gè)值。
場(chǎng)景:累加 、 合并多個(gè)數(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()

方法說明:方法測(cè)試數(shù)組中的某些元素是否通過由提供的函數(shù)實(shí)現(xiàn)的測(cè)試。
場(chǎng)景:檢查數(shù)組中是否含有某個(gè)東西 (和every 是對(duì)立的)
案例:

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 對(duì)象

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)/遍歷效率對(duì)比

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/...

4、原生實(shí)現(xiàn)every 、 filter、forEach、map、reduce、some 等方法

?http://www.jb51.net/article/6...

5、其他參考

https://juejin.im/post/5a3a59...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101739.html

相關(guān)文章

  • JS 數(shù)組循環(huán)遍歷方法對(duì)比

    摘要:循環(huán)方法方法不改變?cè)瓟?shù)組方法會(huì)給原數(shù)組中的每個(gè)元素都按順序調(diào)用一次函數(shù)。篩選出過濾出數(shù)組中符合條件的項(xiàng)組成新數(shù)組代碼方法方法為數(shù)組中的每個(gè)元素執(zhí)行一次函數(shù),直到它找到一個(gè)使返回表示可轉(zhuǎn)換為布爾值的值的元素。 showImg(https://segmentfault.com/img/bV2QTD?w=1600&h=500); 前言 JavaScript 發(fā)展至今已經(jīng)發(fā)展出多種數(shù)組的循環(huán)遍...

    BlackFlagBin 評(píng)論0 收藏0
  • JavaScript 循環(huán)

    摘要:所以結(jié)果的不同就是后者能將循環(huán)內(nèi)容至少執(zhí)行一次。當(dāng)此語(yǔ)句省略時(shí),表示不進(jìn)行條件判斷,循環(huán)將一直執(zhí)行,只有在循環(huán)中使用來(lái)跳出循環(huán)。支持對(duì)數(shù)組和類數(shù)組對(duì)象進(jìn)行循環(huán),不支持普通對(duì)象的循環(huán)。支持對(duì)字符串進(jìn)行循環(huán)遍歷。 JavaScript中直接提供的循環(huán),主要有以下幾種 while 循環(huán) 和其他語(yǔ)言一樣,JavaScript中的while循環(huán)有兩種形式: while (condition) {...

    gitmilk 評(píng)論0 收藏0
  • JS中可能用得到全部排序算法

    本篇有7k+字, 系統(tǒng)梳理了js中常見的12種排序算法。除了基本排序算法,文章還包含了希爾排序、堆排序、桶排序等較為復(fù)雜的排序?qū)崿F(xiàn),如果喜歡請(qǐng)點(diǎn)贊支持~謝謝. 原文: http://louiszhai.github.io/20... 導(dǎo)讀 排序算法可以稱得上是我的盲點(diǎn), 曾幾何時(shí)當(dāng)我知道Chrome的Array.prototype.sort使用了快速排序時(shí), 我的內(nèi)心是奔潰的(啥是快排, 我只知道...

    verano 評(píng)論0 收藏0
  • java知識(shí)體系梳理-->數(shù)組

    摘要:知識(shí)體系梳理流程圖一維數(shù)組數(shù)組概述數(shù)組是指一組數(shù)據(jù)的集合,數(shù)組中的每個(gè)數(shù)據(jù)被稱作元素。定義打印數(shù)組元素方法按照給定的格式打印題目分析通過觀察發(fā)現(xiàn),要實(shí)現(xiàn)按照指定格式,打印數(shù)組元素操作。按照這種方式,數(shù)組循環(huán)多圈以后,就完成了數(shù)組元素的排序。 知識(shí)體系梳理流程圖 showImg(https://segmentfault.com/img/bVXwAi?w=902&h=652); 一維數(shù)組 ...

    james 評(píng)論0 收藏0
  • Week 2 - Java 容器 - 詳細(xì)剖析 List 之 ArrayList, Vector,

    摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)??焖匐S機(jī)訪問就是通過元素的序號(hào)快速獲取元素對(duì)象對(duì)應(yīng)于方法。而接口就是用來(lái)標(biāo)識(shí)該類支持快速隨機(jī)訪問。僅僅是起標(biāo)識(shí)作用。,中文名為雙端隊(duì)列。不同的是,是線程安全的,內(nèi)部使用了進(jìn)行同步。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識(shí)點(diǎn)中,關(guān)于List的需要重點(diǎn)記錄的知識(shí)點(diǎn)。...

    MartinDai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

xfee

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<