ES6常见遍历数组函数的用法

Title:了解一个函数用法重点是要看它的两个点:参数和返回值!!!

一、forEach
回调函数参数,item(数组元素)、index(序列)、arr(数组本身) 循环数组,无返回值,不改变原数组
不支持return操作输出,return只用于控制循环是否跳出当前循环

var myArr=[{id:1,name:“sdf”},{id:2,name:“dfsdf”}, {id:3,name:“fff”}]
myArr.forEach((item,index)=>{
      console.log(item.id);}
       //结果:1,2,3
})

注意:foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。
**

二、includes

判断数组是否包含某个元素
1、参数:第一个是查询的元素,第二个是从什么位置开始查询(可以是负数)
2、不用return,不用回调函数,返回布尔值。
3、ES6提供了Array.includes()函数判断是否包含某一元素,除了不能定位外,解决了indexOf的上述的两个问题。它直接返回true或者false表示是否包含元素,对NaN一样能有有效。

const arr1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', NaN]
console.log('%s', arr1.includes('c'))  //true
console.log('%s', arr1.includes(NaN))  //true
console.log('%s', arr1.includes('d', 4))  //false
console.log('%s', arr1.includes('k', -1)) //false

注意:在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方面是没问题,就是不够语义化。另一个问题是不能判断是否有NaN的元素。

const arr1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', NaN]
console.log('%s', arr1.indexOf(NaN))
//输出:-1

三、filter
使用return操作输出,会循环数组每一项,并在回调函数中操作
过滤筛选的作用,数组filter后,返回的结果为新的数组

let arr1 = [
            {name: 'zhangsan', age: 18, sex: 'male'},
            {name: 'lisi', age: 30, sex: 'male'},
            {name: 'xiaohong', age: 20, sex: 'female'}
        ];
let arr2 = arr1.filter(item => item.age > 20);
        console.log(arr2);   // [{name: "lisi", age: 30, sex: "male"}]
        console.log(arr1);   // [{name: 'zhangsan', age: 18, sex: 'male'},{name: 'lisi', age: 30, sex: 'male'},{name: 'xiaohong', age: 20, sex: 'female'}]

四、map
输出的是return什么就输出什么新数组
原数组被“映射”成对应新数组,返回新数组,不改变原数组

var num = [1,2,3,4];
var dataAdd = num.map(n => n+n);
var datadeep = num.map(n => n-1);
console.log(dataAdd);//[2, 4, 6, 8]
console.log(datadeep);//[0,1,2,3]

五、find
用来查找目标元素,找到就返回该元素,找不到返回undefined
输出的是一旦判断为true则跳出循环输出符合条件的数组元素

let arr1 = [
            {name: 'zhangsan', age: 18, sex: 'male'},
            {name: 'lisi', age: 30, sex: 'male'},
            {name: 'xiaohong', age: 20, sex: 'female'}
        ];
 let arr2 = arr1.filter(item => item.name === 'zhangsan');
        console.log(arr2); //返回两条数据 [{name: "zhangsan", age: 18, sex: "male"}1: {name: "zhangsan", age: 20, sex: "female"}]

六、some
some 英语翻译为一些,every翻译为所有,每个,所以some方法 只要其中一个为true 就会返回true的,相反,every()方法必须所有都返回true才会返回true,哪怕有一个false,就会返回false;every()和 some()目的:确定数组的所有成员是否满足指定的测试。

var computers = [
    {name:"Apple",ram:8},
    {name:"IBM",ram:4},
    {name:"Acer",ram:32},
];
 var result= computers.every(function(computer){
   return computer.ram > 16
})
console.log(result)//false;
var some = computers.some(function(computer){
   return computer.ram > 16
})
console.log(some)//true;

七、reduce
累加器,输出的是return叠加什么就输出什么
回调函数参数四个
pre: 初始值(之后为上一操作的结果)
cur: 当前元素之
index: 当前索引
arr: 数组本身
主要有以下几种用法:
1.数组求和

[1,2,3,4].reduce((pre, cur) => pre + cur)//10

2.二维数组转为一维数组

[[1, 2], [3, 4], [5, 6]].reduce(( acc, cur ) => [...acc, ...cur], [])//[1, 2, 3, 4, 5, 6]

3.计算数组中每个元素出现的次数

const arraySum = (arr, val) => arr.reduce((acc, cur) => {
return cur == val ? acc + 1 : acc + 0
}, 0);
let arr = [1, 2, 3, 4, 5];
arraySum(arr, 0) //3

4.代替filter和map的组合

const characters = [
{ name: 'ironman', env: 'marvel' },
{ name: 'black_widow', env: 'marvel' },
{ name: 'wonder_woman', env: 'dc_comics' },
];
console.log(characters.filter(character => character.env === 'marvel')
.map(character => Object.assign({}, character, { alsoSeenIn: ['Avengers'] }))
);
// [
// { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] },
// { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] }
// ]

  console.log(characters.reduce((acc, character) => {
  return character.env === 'marvel'? acc.concat(Object.assign({}, character, { alsoSeenIn:   ['Avengers'] })): acc;}, []))
// [
// { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] },
// { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] }

八、new Set()
基本思路:
1、ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
2、Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。
3、任何类似数组的对象可以用扩展运算符转换为真正的数组。

let arr = [1, 2, 2, 3];
let set = new Set(arr);
let newArr = Array.from(set);
console.log(newArr); // [1, 2, 3]
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值