for、map、forEach、filter等方法都是对数组进行操作的,他们之间的区别有哪些?下面来盘点一下。

一、for 循环

for 循环是一种基本的控制结构,用于迭代数组中的元素。通过使用 for 循环,您可以自定义迭代逻辑以及要执行的操作。例如:

for 循环语法如下:

for (初始值; 循环条件; 递增表达式) {
  // 循环体代码
}


let arr = ["1","2","3","4","5"];

for(var i=0; i<arr.length; i++){
	console.log(arr[i])
}

// 输出 [1, 2, 3, 4, 5]

还可以使用for循环嵌套,来实现更复杂的循环逻辑,例如打印乘法口诀表

for (let i = 1; i <= 9; i++) {
  for (let j = 1; j <= 9; j++) {
    console.log(i + " * " + j + " = " + (i * j));
  }
}

// 输出乘法口诀表
// 使用 break 语句可以调出循环
for(let i=1;i<=10;i++) {
	if(i==4){
		break; // 跳出循环,执行循环后面的语句(整个循环便终止了)
	}
	console.log(i)
}

// 输出 1, 2, 3


// 使用 continue 语句可以跳过循环
for(let i=1;i<=10;i++) {
	if(i==4 || i==7 || i==9){
		continue; // 中断循环中的迭代,然后继续循环中的下一个迭代
	}
	console.log(i)
}

// 输出 1, 2, 3, 5, 6, 8, 10

提示:for 可以使用 break 语句中断循环或使用 continue 跳过循环;

二、map循环

map()方法用于对数组中的每个元素进行遍历,并将每个元素传递给回调函数进行处理。返回一个新的数组,其中包含了回调函数对每个元素处理后的结果。

map() 语法如下:

array.map(callback(element, index, array), thisValue)


参数说明:

callback: 必须,标识对数组中的每个元素进行处理的回调函数,它可以接收三个参数:
          element: 表示当前处理的元素
          index: 可选,表示当前处理元素的索引
          array: 可选,表示正在处理的数组

thisValue:可选,表示在执行回调函数时使用的this值, 如果省略了 thisArg,或者传入 null、undefined,那么回调函数的 this 为全局对象。

使用 map() 方法对数组中的每个元素乘以2

let arr1 = [1, 2, 3, 4, 5]

let arr2 = arr1.map((n) => n * 2)

console.log(arr1) // 输出 [1, 2, 3, 4, 5]

console.log(arr2) // 输出 [2, 4, 6, 8, 10]

提示:
1.map()方法不会对空数组进行检测;
2.map()函数不会改变原始数组,它形成的是 一个新的数组;
3.不能抹除条件不成立的元素,下标对应位置会变成undefined;

三、forEach循环

forEach()方法用于遍历数组的每个元素,接受一个回调函数作为参数,并对数组中的每个元素执行该回调函数。

forEach() 语法如下:

array.forEach(callback(currentValue, index, array))


参数说明:

callback是在每个元素上执行的回调函数。回调函数接受三个参数:

currentValue:当前正在处理的元素。
index(可选):当前元素在数组中的索引。
array(可选):正在被遍历的数组。


let arr = [1, 2, 3, 4, 5];

// 使用forEach遍历数组并打印每个元素
arr.forEach(function(n) {
  console.log(n)      // 输出 [1, 2, 3, 4, 5]
  console.log(n + 5)  // 输出 [6, 7, 8, 9, 10]
  console.log(n * 2)  // 输出 [2, 4, 6, 8, 10]
})


// 跳过
arr.forEach((val)=> {
    if(val == 3) return  // 跳过3的元素
    console.log(val)    // [1,2,4,5]
})

// 不支持return语句
let arr1 = arr.forEach((val) => {
	return val * 2
})

console.log(arr1)   // undefined  没有返回值, 返回结果为undefined

提示:
1.forEach 不支持return、break、continue等语句,break和continue会直接报错,return 会返回 undefined;
2.不能中断循环;

四、filter 筛选

filter()方法会筛选出数组中符合条件的元素,返回一个新数组。

filter() 语法如下:

array.filter(callback(currentValue,index,arr), thisValue)


参数说明:

array:要进行过滤的数组。

callback:一个用于测试每个元素的函数。它可以接受三个参数:
          element:当前正在处理的元素。
          index(可选):当前正在处理的元素的索引。
          array(可选):调用filter()的数组本身。

thisValue(可选):在执行回调函数时使用的this值。


let arr1 = [1, 8, 10, 22, 30, 60]


let arr2 = arr1.filter((item) => item > 20)


console.log(arr2) // 输出 [22, 30, 60]


let info = [
   { name:'张三', city: '黄冈市'},
   { name:'李四', city: '武汉市'},
   { name:'王五', city: '广州市'},
   { name:'赵六', city: '黄冈市'},
   { name:'田七', city: '深圳市'},
]

// 筛选出城市为黄冈市的用户
let arr3 = info.filter((item) => item.city === '黄冈')

console.log(arr3) // 输出 [{name: '张三', city: '黄冈'}, {name: '赵六', city: '黄冈'} ]


// filter 求交集和并集

let a = [1,2,3]   let b = [2,3,5]

// 求交集  
let intersection = a.filter(v => b.includes(v))   // [2,3]

// 求并集
let union = a.concat(b.filter((v) => { return !(a.indexOf(v) > -1)}));  // [1,2,3,5]

提示:
1.filter()方法不会对空数组进行检测;
2.filter()函数不会改变原始数组,它形成的是 一个新的数组;

五、总结

06-06 03:22