for 循环 和 Array 数组对象

本文深入探讨了JavaScript中for循环、for-in、for-of及forEach的效率对比,并详细解析了Array数组对象的各种方法,包括filter、map、find等重点难点。

博客地址:https://ainyi.com/12

 

for 循环 和 Array 数组对象方法

 for for-in for-of forEach效率比较

- 四种循环,遍历长度为 1000000 的数组叠加,得到的时间差:

 

for 3
for-in 250
for-of 7
forEach 44

- 效率速度:for > for-of > forEach > for-in

- for循环本身比较稳定,是for循环的i是Number类型,开销较小
- for-of 循环的是val,且只能循环数组,不能循环对象
- forEach 不支持 return 和 break,一定会把所有数据遍历完毕
- for-in 需要穷举对象的所有属性,包括自定义的添加的属性也会遍历,for...in的key是String类型,有转换过程,开销比较大
 
 1 // 面试: for, forEach, for-in, for-of(es6)
 2 
 3 let arr = [1,2,3,4,5];
 4 arr.b = '100'; // 自定义私有属性
 5 
 6 
 7 
 8 // for循环 速度最快
 9 for (let i = 0; len = arr.length, i < len; i++) { // 编程式
10 console.log("for循环"+arr[i]);
11 }
12 
13 
14 
15 // forEach 不支持return和break,无论如何都会遍历完,
16 arr.forEach(function(item){
17 console.log("forEach循环"+item);
18 });
19 
20 
21 
22 // for-in 遍历的是 key 值,且 key 会变成字符串类型,包括数组的私有属性也会打印输出
23 for(let key in arr){
24 console.log("for in循环"+key);
25 console.log(typeof key);
26 }
27 
28 
29 
30 // for-of 遍历的是值 val,只能遍历数组 (不能遍历对象)
31 for(let val of arr){
32 console.log("for of循环"+val);
33 }
34 
35 
36 // Object.keys 将对象的 key 作为新的数组,这样 for-of 循环的就是原数组的 key 值
37 let obj = {school:'haida',age:20};
38 // 变成 ['school','age']
39 for(let val of Object.keys(obj)){
40 console.log(obj[val]);
41 }

 

 JavaScript Array 数组对象方法

- 不改变原数组:concat、every、filter、find、includes、indexOf、isArray、join、lastIndexOf、map、reduce、slice、some、toString、valueOf
- 改变原数组:pop、push、reverse、shift、sort、splice、unshift
 

 重点难点解析

- filter、map、find、includes、some、every、reduce、slice
- 数组变异:pop、shift、splice、unshift
  1 // filter 过滤:可用于删除数组元素
  2 // 不改变原数组,过滤后返回新数组
  3 // 回调函数的返回值:若 true:表示这一项放到新数组中
  4 let newArr = [1,2,3,4,5].filter(item => item>2 && item <5);
  5 //数组元素>2且<5的元素返回true,就会放到新数组
  6 console.log("新数组:"+newArr);
  7 
  8 
  9 
 10 
 11 // map 映射,将原有的数组映射成一个新数组 [1,2,3],用于更新数组元素
 12 // 不改变原数组,返回新数组
 13 // 回调函数中返回什么这一项就是什么
 14 // 若要拼接 <li>1</li><li>2</li><li>3</li>
 15 let arr2 = [1,2,3].map(item => `<li>${item}</li>`);
 16 // join方法用于把数组中的所有元素放入一个字符串。每个元素通过指定的分隔符进行分隔。
 17 // 这里使用''空字符分割
 18 console.log(arr2.join(''));
 19 
 20 
 21 // 若只要 name 的 val 值,不要 key 值
 22 let arrJson = [{'name':'krry'},{'name':'lily'},{'name':'xiaoyue'},{'name':'krry'}];
 23 let newArrJson = arrJson.map( val => val.name);
 24 console.log(`newArrJson:${newArrJson}`);
 25 
 26 
 27 
 28 
 29 // find:返回找到的那一项
 30 // 不改变原数组
 31 // 找到后停止循环,找不到返回的是 undefined
 32 let arrFind = [1,2,3,4,55,555];
 33 let result = arrFind.find((item,index) => {
 34 return item.toString().indexOf(5) > -1;// 找数组元素中有5的第一项
 35 });
 36 console.log(result); // 输出 55
 37 
 38 
 39 
 40 
 41 // includes 数组中是否包含某个元素,返回 true or false
 42 let arr3 = [1,2,3,4,55,555];
 43 console.log(arr3.includes(5));
 44 
 45 
 46 
 47 
 48 // some:如果有一个元素满足条件,则表达式返回 true, 剩余的元素不会再执行检测。
 49 // 如果没有满足条件的元素,则返回 false
 50 let arrSF = [1,2,3,4,555];
 51 let result = arrSF.some((item,index)=>{
 52 return item > 3;
 53 });
 54 console.log(result); // 输出true
 55 
 56 
 57 
 58 
 59 // every:如果有一个元素不满足,则表达式返回 false,剩余的元素不会再进行检测。
 60 // 如果所有元素都满足条件,则返回 true
 61 let arrSE = [1,2,3,4,555];
 62 let result = arrSE.every((item,index)=>{
 63 return item > 3;
 64 });
 65 console.log(result); // 输出 false
 66 
 67 
 68 
 69 
 70 // reduce 收敛函数, 4个参数 返回的是叠加后的结果
 71 // 不改变原数组
 72 // 回调函数返回的结果:
 73 // prev:数组的第一项,next是数组的第二项(下一项)
 74 // 当前 return 的值是下一次的 prev
 75 let sum = [1,2,3,4,5].reduce((prev,next,index,item)=>{
 76 // console.log(arguments);
 77 // 1 2
 78 // 3 3
 79 // 6 4
 80 // 10 5
 81 console.log(prev,next);
 82 return prev+next; // 返回值会作为下一次的 prev
 83 });
 84 console.log(sum);
 85 
 86 
 87 // reduce 可以默认指定第一轮的 prev,那么 next 将会是数组第一项(下一项)
 88 // 例子:算出总金额:
 89 let sum2 = [{price:30,count:2},{price:30,count:3},{price:30,count:4}];
 90 let allSum = sum2.reduce((prev,next)=>{
 91 // 0+60
 92 // 60+90
 93 // 150+120
 94 console.log(prev,next);
 95 return prev+next.price*next.count;
 96 },0); // 默认指定第一次的 prev 为 0
 97 console.log(allSum);
 98 
 99 
100 // 利用reduce把二维数组变成一维数组
101 let flat = [[1,2,3],[4,5,6],[7,8,9]].reduce((prev,next)=>{
102 return prev.concat(next); // 拼接数组
103 });
104 console.log(flat);
105 
106 
107 
108 
109 // slice 从已有的数组中返回选定的元素
110 // 不改变原数组
111 let fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
112 let citrus = fruits.slice(1,3);
113 console.log(citrus); // 输出 Orange,Lemon
114 
115 
116 
117 
118 // pop 用于删除数组的最后一个元素并返回删除的元素
119 // 改变原数组
120 let fur = ["Banana", "Orange", "Apple", "Mango"];
121 fur.pop();
122 console.log(fur); // 输出 Banana,Orange,Apple
123 
124 
125 
126 
127 // shift 用于把数组的第一个元素从其中删除,并返回第一个元素的值
128 // 改变原数组
129 let fts = ["Banana", "Orange", "Apple", "Mango"];
130 fts.shift();
131 console.log(fts);// 输出 Orange,Apple,Mango
132 
133 
134 
135 
136 // unshift 向数组的开头添加一个或更多元素,并返回新的长度
137 // 改变原数组
138 let fse = ["Banana", "Orange", "Apple", "Mango"];
139 fse.unshift("Lemon","Pineapple");
140 console.log(fse); // 输出 Lemon,Pineapple,Banana,Orange,Apple,Mango
141 
142 
143 
144 
145 // splice 用于插入、删除或替换数组的元素
146 // 改变原数组
147 let myArrs = ["Banana", "Orange", "Apple", "Mango"];
148 myArrs.splice(2,1); // 从数组下标为 2 开始删除,删除 1 个元素
149 console.log(myArrs); // 输出 Banana,Orange,Mango

 

 额外谈一下arguments

 1 // arguments 是一个对应于传递给函数的参数的类数组对象
 2 // 此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。
 3 // 例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
 4 // arguments[0]
 5 // arguments[1]
 6 // arguments[2]
 7 let xx = sumAll(1, 123, 500, 115, 44, 88);
 8  
 9 function sumAll() {
10 let i, sum = 0;
11 for (i = 0; i < arguments.length; i++) {
12 sum += arguments[i];
13 }
14 console.log(sum); // 返回总和 871
15 }

 

 for 效率测试代码

 1 let arr = new Array();
 2 for(let i = 0, len = 1000000;i < len; i++){
 3 arr.push(i);
 4 }
 5  
 6 function foradd(my_arr){
 7 let sum = 0;
 8 for(let i = 0; i < my_arr.length; i++){
 9 sum += my_arr[i];
10 }
11 }
12  
13 function forinadd(my_arr){
14 let sum = 0;
15 for(let key in my_arr){
16 sum += my_arr[key];
17 }
18 }
19  
20 function forofadd(my_arr){
21 let sum = 0;
22 for(let val of my_arr){
23 sum += val;
24 }
25 }
26 
27 
28 function forEachadd(my_arr){
29 let sum = 0;
30 my_arr.forEach(val => {
31 sum += val;
32 });
33 }
34  
35 function timeTest(func,my_arr,str) {
36 var start_time = null;
37 var end_time = null;
38 start_time = new Date().getTime();
39 func(my_arr);
40 end_time = new Date().getTime();
41 console.log(str,(end_time - start_time).toString());
42 }
43  
44 timeTest(foradd,arr,'for');
45 timeTest(forinadd,arr,'for-in');
46 timeTest(forofadd,arr,'for-of');
47 timeTest(forEachadd,arr,'forEach');

 

博客地址:https://ainyi.com/12

转载于:https://www.cnblogs.com/ainyi/p/9203374.html

<think> 首先,用户的问题是:“我想查找使用Python循环遍历数组对象的方法 请问Python循环遍历数组对象的方法”。这直接询问如何在Python中使用循环遍历数组对象。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法必须正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户还提供了站内引用: - 引用[1]:讨论了Python数组遍历的三种方法:for循环、while循环迭代器。它强调了for循环的直观性、while循环的灵活性以及迭代器的速度安全性。 - 引用[2]:显示了使用enumerate()函数在for循环中遍历数组的示例。 虽然引用仅供参考,但用户说“上述引用仅供参考,并不是用户真正的需求”,所以我应该基于用户的问题回答,但可以适当参考这些引用。 用户的问题是“我想查找使用Python循环遍历数组对象的方法”,所以我需要提供Python中遍历数组对象的各种循环方法。 关键点: - 在Python中,数组通常指的是列表(list),因为Python没有内置的array类型(除了array模块,但列表更常见)。 - 遍历方法包括: 1. for循环遍历。 2. while循环遍历。 3. 使用迭代器(如enumerate())。 4. 其他如列表推导式,但用户指定了“循环遍历”,所以焦点在循环。 从引用[1]: - 传统for循环:直观。 - while循环:更灵活。 - 迭代器遍历:速度快且安全。 从引用[2]: - 使用enumerate()的例子。 所以,在我的回答中,我应该覆盖: - for循环遍历。 - while循环遍历。 - 使用enumerate()的遍历。 - 可能其他相关方法如索引遍历。 结构回答: - 回答必须结构清晰,帮助用户逐步解决问题。 - 使用中文。 - 末尾生成相关问题。 大纲回答: 1. 介绍Python中遍历数组对象的基本概念。 2. 逐步解释不同方法: - 使用for循环遍历元素。 - 使用while循环遍历索引。 - 使用enumerate()遍历索引元素。 3. 提供代码示例。 4. 比较方法的优缺点或适用场景。 5. 末尾添加引用标识(如果有引用来源)。 6. 生成相关问题。 引用来源:用户提供了引用[1][2],所以我需要在回答中自然地添加引用标识。例如,提到某些点时引用它们。 最终,生成相关问题: - 基于主题,如“Python中遍历字典的方法?”或“如何遍历多维数组?”等。 确保回答真实可靠: - 我是基于正确的Python知识:遍历列表可以使用for item in list:,for i in range(len(list)):,while i < len(list):,等。 完整回答结构: - 开头:解释数组在Python中通常指的是列表。 - 方法1:for循环遍历元素。 - 代码示例。 - 方法2:使用索引遍历(for循环或while循环)。 - for循环带索引。 - while循环。 - 方法3:使用enumerate()遍历索引元素。 - 代码示例。 - 简要比较。 - 结尾:总结。 - 生成相关问题。 添加引用标识: - 比如提到“迭代器遍历速度快”时引用[1]。 - 提到“enumerate()函数”时引用[2]。 数学表达式:用户问题没有涉及数学,所以可能不需要数学表达式,但系统指令说所有行内数学表达式必须使用$...$。如果有任何数学,如索引计算,就用$...$。但这里可能不涉及,除非有索引公式等。如果没有,就不强行添加。 </think> ### Python循环遍历数组对象的方法 在Python中,“数组对象”通常指的是列表(list),因为列表是最常用的序列类型。虽然Python有array模块提供更高效的数字数组,但列表更通用。遍历数组对象的基本方法是使用循环结构,主要包括for循环、while循环以及结合迭代器(如enumerate())的方式。以下我将逐步解释每种方法,并提供代码示例。这些方法都基于Python标准语法,确保可靠性实用性。 #### 1. **使用for循环遍历元素(直接遍历)** 这是最简单直观的方法,适合初学者。通过for循环直接迭代数组中的每个元素,无需索引计算。 示例代码: ```python # 定义一个数组(列表) arr = [10, 20, 30, 40] # 使用for循环遍历每个元素 for item in arr: print(item) # 输出每个元素的值 ``` - **优点**:代码简洁,易于理解;适用于不需要索引的场景,如打印所有元素。 - **缺点**:无法直接访问索引;对于需要修改元素的操作不太灵活。 - 引用[1]提到,传统for循环遍历最直观,适合初学者[^1]。 #### 2. **使用for循环遍历索引(带索引遍历)** 如果需要访问元素的索引位置(如修改特定元素),可以使用range()函数生成索引序列。 示例代码: ```python arr = ["apple", "banana", "cherry"] # 使用for循环遍历索引(0到len(arr)-1) for i in range(len(arr)): print(f"索引: {i}, 值: {arr[i]}") # 输出索引对应值 ``` - **优点**:访问索引方便;支持元素修改(例如 `arr[i] = new_value`)。 - **缺点**:索引计算可能增加错误风险(如索引越界);性能略低于直接遍历。 - 引用[1]指出,while循环for循环更灵活,但for循环索引遍历已足够灵活[^1]。 #### 3. **使用enumerate()函数遍历索引元素** `enumerate()`是Python内置函数,同时返回索引元素,避免了手动管理索引。 示例代码(参考引用[2]): ```python fruits = ["apple", "banana", "cherry"] # 使用enumerate()遍历 for index, fruit in enumerate(fruits): print(f"索引: {index}, 水果: {fruit}") # 输出索引元素 ``` - **优点**:代码安全、简洁;不易出错,因为索引自动生成;遍历速度较快(迭代器优化)。 - **缺点**:对于简单遍历可能显得冗余。 - 引用[2]展示了如何使用enumerate()在for循环中高效访问索引元素[^2]。引用[1]强调迭代器遍历速度快且安全[^1]。 #### 4. **使用while循环遍历索引** while循环提供更精细的控制,如自定义计数器或条件中断。 示例代码: ```python arr = [5, 10, 15] i = 0 # 初始化计数器 while i < len(arr): print(f"索引{i}: {arr[i]}") i += 1 # 手动递增计数器 ``` - **优点**:高度灵活,适合复杂逻辑(如遍历中途跳过元素或提前退出)。 - **缺点**:代码冗长;容易忘记更新计数器导致无限循环。 - 引用[1]提到,while循环支持自定义计数器其他逻辑控制[^1]。 #### 方法比较与适用场景 - **for循环**:最佳选择初学者或简单遍历场景。 - **enumerate()**:推荐用于需要同时访问索引元素的场景(如数据处理)。 - **while循环**:适合自定义逻辑或动态调整遍历过程(如过滤元素)。 - **总体原则**:根据需求选择——如果只关心元素值,用直接for循环;如果需要索引,优先使用enumerate()以提高代码安全性。 这些方法都基于Python的核心语法,真实可靠。实际应用中,数组通常用列表表示,但类似方法也适用于元组、字符串等序列类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值