数组

数组

扩展操作符

ES6中可使用扩展操作符在一个数组字面量中包含另一个数组

let a = [1, 2, 3]
let b = [0, ...a, 4]    // [0, 1, 2, 3, 4]
// 扩展操作符可用于任何可迭代对象
let digits = [..."adsadassfasfasfsff"] // ["a", "b", "s", ..., "f", "f"]
// 若想去重,可借助集合
let letters = [ ...new Set(digits)]

稀疏数组

稀疏数组就是数组中有空位,其length值大于实际元素的个数

let c = ["0"]
c[10] = "10"
c[3] = undefined
console.log(c) // [ '0', <2 empty items>, undefined, <6 empty items>, '9' ]

迭代稀疏数组,会发现空位为undefined,但并非表示空位的值是undefined

for(let i of c){
    console.log(i)  // 空位为undefined
}
console.log(c.length)   // 11
console.log(1 in c) // c[1]为真正的空值,没有元素,返回为false
console.log(3 in c) // c[3]为undefined元素,并非真的没有元素,返回为true

forEach可以感知到稀疏数组,并跳过空位

c.forEach(element=>{
    console.log(element)  // foreach能感知到稀疏数组,并跳过空位
})

filter过滤

filter传入一个回调函数,去除返回值为false的元素,返回一个新的数组

let arr = [5, 4, 3, 2, 1]
let arrFilter = arr.filter(x => x<3)  // 过滤掉大于等于三的元素,返回新数据
filter会自动过滤掉稀疏数组中的空位,返回稠密数组
arr.filter(() => true)  // 所以可以使用filter过滤空值

find与findIndex

let f = arr.find( x => x===3)   // 返回第一个匹配项,找不到返回undefined
let fIdx = arr.findIndex( x => x > 3)   // 返回第一个匹配项的索引,找不到返回-1

every与some

every只有所有项都匹配时,才会返回true;some只要有一个匹配项,就返回true
arr.every( x => x <10)
arr.some( x => x === 3)

reduce 与 reduceRight

归并,根据条件返回一个最终结果,reduceRight()是从右向左归并
arr.reduce((x, y) => x + y) // 条件是求和,那么就逐一相加,每次的结果将取代x,并进行下一次归并
arr.reduce((x, y) => (x > y) ? x : y, 100) // 条件为找出最大值,第二个参数为初始的x值,结果为100

map

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

let strArr = ["hello world", "the definitive guide"]
strArr.map(x => x.split(" "))  // [ [ 'hello', 'world' ], [ 'the', 'definitive', 'guide' ] ]

flat()与flatMap()打平数组

let matrix = [1, [2, [3, [4]]]]
matrix.flat()  // [ 1, 2, [ 3, [ 4 ] ] ]
matrix.flat(1) // [ 1, 2, [ 3, [ 4 ] ] ]
matrix.flat(2) // [ 1, 2, 3, [ 4 ] ]
matrix.flat(3) // [ 1, 2, 3, 4 ]
matrix.flat(4) // [ 1, 2, 3, 4 ]
flatMap() 等同于(但效率远高于) map().flat(),可以把flatMap理解为通用版的map
let strArr = ["hello world", "the definitive guide"]
strArr.flatMap(x => x.split(" ")) // [ 'hello', 'world', 'the', 'definitive', 'guide' ]

concat()

添加数组,原始数组不变, 可以打平数组,但不会递归的打平嵌套的数组

let addArr = [1, 2, 3]
a.concat(4, 5)  // [1, 2, 3, 4, 5]
a.concat([4, 5], [6, 7]) // [1, 2, 3, 4, 5, 6, 7]
a.concat(4, [5, [6, 7]]) // [1, 2, 3, 4, 5, [6, 7]]

slice()切片

let arr = [5, 4, 3, 2, 1]
arr.slice(0, 2) // [5, 4] [0, 2) 前闭后开
arr.slice(3)    // [2, 1] 从索引3开始到结尾
arr.slice(1, -1) // [4, 3, 2] 支持负索引

fill()填充

可只填充切片部分
let farr = new Array(5)
farr.fill(0)    // [0, 0, 0, 0, 0]
farr.fill(9, 1) // [0, 9, 9, 9, 9]
farr.fill(8, 2, -1) // [0, 9, 8, 8, 9]

copyWithin()

copyWithin(index, startIndex, endIndex),把指定切片复制到指定索引处,会修改原数组, 支持负索引
let arr = [5, 4, 3, 2, 1]
arr.copyWithin(1)   // [5, 5, 4, 3, 2]
arr.copyWithin(2, 3, 5)   // [5, 5, 3, 2, 2]
arr.copyWithin(0, -2)   // [2, 2, 4, 2, 2]

其他

indexOf lastIndexOf 查找匹配项中第一个和最后一个的索引,没有返回-1
includes() ES6新方法测试数组中是否包含某个值,返回true或false
sort( a, b =>{ return a - b })   若 < 0,则a在前,若 > 0,则b在前
arr.join("+")  可以理解为split的反向操作,若不传参数,则默认为使用","相连
Array.isArray([]) 用于确定一个未知值是否是数组,返回true或false
arr.length = 3  修改数组长度会截断数组
posted @ 2021-12-09 21:01  邢韬  阅读(56)  评论(0编辑  收藏  举报