ES6新增的数组方法

Array.from()

用于将两类对象转为真正的数组:

类数组 、 可遍历对象(包括ES6新增的Set 和 Map)

意味着,只要部署了Iterator接口的数据结构,Array.from都能将其转换为数组

实际开发中,一般可以用来转换DOM操作返回的NodeList集合,以及函数内部的arguments对象

传一个参数时,用于将类数组转为真正的数组

数组去重
const arr = [1,2,3,3,3,2,5];
console.log(Array.from(new Set(arr))); //[1,2,3,5]
//...也可实现相同的效果
console.log([...new Set(arr)]) //[1,2,3,5]

对于没有部署该方法的浏览器,可使用Array.prototype.slice方法代替

cosnt toArray = (() => {
     
    Array.from ? Array.from : obj => [].slice.call(obj)
})()

还可以接收第二个参数,第二个参数传入一个函数,实现类似map方法的效果,对每个元素进行处理并返回处理好的数组

Array.from([1,2,3] , item => item *2)    //[2,4,6]
返回字符串的长度

可以用于将字符串转为数组,然后返回字符串的长度,因为它能够正确处理各种Unicode字符,从而避免JS将大于/uFFFF的Unicode字符算作2个字符的自身bug

function countLength(string) {
     
    return Array.from(string).length
}

Array.of()

用于将传入的一组值转换为数组

用于弥补Array()构造函数的不足,

console.log(Array(2))  //[empty*2]  
console.log(Array.of(2))  //[2]
console.log(Array.of(undefined))  //[undefined]

Array.of()的行为非常一直,总是返回传入的值组成的数组,如果没有传入值,则返回一个空数组

数组实例的copywithin()

在当前数组内部将指定位置的成员复制到其他位置,然后返回当前数组,会改变原数组

接收三个参数:

1、target(必需) 从该位置开始替换数据

2、start(可选) 从该位置开始读取数据,默认为0,如果为负数,则表示到数

3、end(可选) 到该位置前停止读取数据,默认等于数组长度。如果是负数,表示到数

三个参数都应该是数字,如果不是,会自动转为数值

[1,2,3,4,5].copywithin(0,3);  //[4,5,3,4,5]  表示从下标3位置直到结束的成员(4,5),复制到从下标0开始的位置,结果替换掉了原来的1和2

说实话这个方法没有用过,不知道实际可以用来做什么,有知道的大佬指导一下

数组实例的find()和findIndex()

find()

返回第一个符合条件的数组成员,它的参数是一个回调函数,所有数组成员依次执行该函数,直到找出第一个满足条件的成员,然后返回该成员,如果没有符合条件的成员,则返回undefined

该方法的回调函数接收三个参数: 当前的值 , 当前位置, 原数组

[1,12,4,0,5].find((item,index , arr) => return item < 1)   // 0

findIndex()

写法用法基本与find()方法相同,只是返回第一个符合条件的数组成员的位置,如果没有则返回-1

[1,2,4,15,0].findIndex((item , index ,arr) => return item > 10)   //3

这两个方法都可以发现数组中的NaN,而ES5中的indexOf()是发现不了NaN的

数组实例的fill()

使用给定值填充数组

1、只传一个值时:

new Array(3).fill(12)  // [12,12,12]

使用传入的值,填充整个数组,数组中原有项都将被抹去

2、还可以接收第二个 和 第三个参数,用来指定填充起始位置和结束位置

[1,2,3,4,5].fill(6,1,2)  // [1,6,3,4,5] 表示从下标1开始,向数组填充6,到下标2结束

数组实例的entries() 、 keys() 、values()

三个方法都用来遍历数组,都返回一个遍历器对象,可用for…of循环遍历

不同的是:

keys()是对键名的遍历

values()是对键值的遍历

entries()是对键值对的遍历

例:

for(let idx of ['a','b'].keys()) {
     
    console.log(idx)     
}
// 0
// 1
for(let item of ['a','b'].values()) {
     
    console.log(item)
}
// 'a'
// 'b'
for (let [idx , item] of ['a' , 'b'].entries()) {
     
    console.log(idx , item)
}
// 0 'a'
//1 'b'

数组实例的includes()

该方法返回一个布尔值,表示某个数组中是否包含给定的值

[1,2,3].includes(3)  //true
[1,2,3].includes(5)  //false

还可接收第二个参数,表示搜索的起始位置,默认是0。如果第二个参数是负数,则表示到数的位置。如果第二个参数大于数组的长度,则从下标0处开始

也可以识别NaN

[1,23,NaN].includes(NaN)   //true

兼容方法:

function contains = ( () => {
     
    Array.prototype.includes
    	?(arr , val) => arr.includes(val)
    	:(arr , val) => arr.some(item => return item === val)
})()

数组推导

个人认为这个很有意思

数组推导是一种简洁写法,允许直接通过现有数组直接生成新数组

简洁的map方法实现

const arr = [1,2,3];
const arr2 = [for (i of arr) i*2];  //[2,4,6]

简介的filter方法实现

const arr = [3,56,45,23,1,5]
const arr2 = [for (item of arr) if(item > 10) item] //[56,45,23]

注意:if语句要写在for 循环与返回的表达式之间,可以根据需求连着写多个for循环

对字符串也可以使用数组推导
[for (item of 'abcde') if(/[aboui]/.test(item)) item].join('')  //'ab'
[for (item of 'abc') item+"1"].join('')   //'a1b1c1'

你可能感兴趣的:(数组,javascript,es6)