欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【原】javascript笔记之Array方法forEach&map&filter&some&every

程序员文章站 2022-07-01 23:44:55
做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的方法去解决,多年前ES5几个新增的数组方法,好用但是常忘记用,趁着这周比较清闲,重温下并做下笔记,养成记笔记的好习惯。 f ......

做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的方法去解决,多年前es5几个新增的数组方法,好用但是常忘记用,趁着这周比较清闲,重温下并做下笔记,养成记笔记的好习惯。

foreach

foreach是es5的array方法中用得最频繁的一个,就是遍历,循环输出,它接受一个必须的回调函数作为参数。

let arr1 = [1,2,3,4]
arr1.foreach((item)=>{
    console.info(item);
})
//1
//2
//3
//4

等同于传统的for循环。

let arr1 = [1,2,3,4]
for(let i = 1;i<arr1.length;i++){
    console.info(arr1[i])
}
//1
//2
//3
//4

相比for循环,foreach简洁了很多,foreach方法中的回调函数支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。

[].foreach((value, index, array)=> {
});

举个例子:

let array1 = [1, 2, 3, 4]
let array2 =[];

array1.foreach( (item, index, array) => {
   console.info(array1 === array);//(4)true
   array2[index] = item * item;
});

console.info(array2);// [1, 4, 9, 16]

foreach除了接受一个回调函数作为参数,还接受一个可选的上下文参数(改变回调函数里面的this指向)。

array.foreach(callback,[thisobject])

例子,obj.consolefn被调用后,this指向了obj。

let obj = {
  namearr: ["猫", "狗", "羊","鸟"],
  iscat: function (name) {
    return /^猫/.test(name);
  },
  consolefn: function (name) {
    if (this.iscat(name)) {
      console.info(`你是${name}`);
    } else {
      console.info(`你不是${name}`);    
    }
  }
}

obj.namearr.foreach(obj.consolefn,obj);
// 你是猫
// 你不是狗
// 你不是羊
// 你不是鸟

下面的例子obj.consolefn作为foreach的参数后被调用,此时如果没有指定foreach的上下文参数,那么obj.consolefn中this指向window,会导致页面报错。这里要了解this的知识,可以查看这篇文章《javascript笔记之this用法》。

如下代码,window下并没有iscat函数,所以会出现报错。

let obj = {
  namearr: ["猫", "狗", "羊","鸟"],
  iscat: function (name) {
    return /^猫/.test(name);
  },
  consolefn: function (name) {
    if (this.iscat(name)) {
      console.info(`你是${name}`);
    } else {
      console.info(`你不是${name}`);    
    }
  }
}

obj.namearr.foreach(obj.consolefn);// uncaught typeerror: this.iscat is not a function

foreach不会遍历空元素

let array3 = [1,,3]
console.info(array3.length); //3
array3.foreach((item)=>{
    console.info(item);
}); 
//1
//3

map

map是es5的array方法中最基本的一个,其基本用法跟foreach类似,也是遍历,不同是的最终输出一个新的数组

array.map(callback,[thisobject]);

callback的参数跟foreach一样。

array.map(function(value, index, array) {
//callback需要有return值
});

map函数是把原数组被“映射”成一个新数组

let array1 = [1, 2, 3, 4]
let array2 = array1.map( (item, index, array) => {
   return item * item
});

console.info(array2); // [1,4,9,16]

filter

filter为“过滤”、“筛选”之意。指数组通过filter后,返回过滤后的新数组。

array.filter(callback,[thisobject]);

filter的callback函数需要返回布尔值true或false(返回值只要是弱等于== true/false就可以了),callback需要有return值

比如,下面数组中array4的前2个组返回0和false则被过滤掉。

const array4 = [0, false, 2, 3];
const array5 = array4.filter(function(item) {
    return item;
});
console.info(array5); // [2, 3]

再来一个例子,把数组中的猪过滤掉。

const array6 = ["猫", "狗", "羊", "猪"];
const array7 = array6.filter(function(item) {
    if(item == '猪') return false
    else return item
});
console.info(array7); // ["猫", "狗", "羊"]

some

some意指“某些”,指是否“某些项”合乎条件。用法如下:

array.some(callback,[thisobject]);

some要求至少有1个值让callback返回true就可以了,如下例子:

const arrfraction = [60, 80, 95, 70];
const passfraction = 90;//有一个人高于90分就通过入学考试

const result = arrfraction.some((item)=>{return item > passfraction
})
if(result){
    console.info("通过入学考试");
}

every

every意指“每一项”,指所有必须合乎条件,只要一项不符合则返回false。用法如下:

const arrfraction = [91, 93, 95, 89];
const passfraction = 90;//所有人高于90分就通过入学考试

const result = arrfraction.every((item)=>{
    return item > passfraction
})
if(result){
    console.info("通过入学考试");
}else{
    console.info("不通过入学考试");
}