数组常用操作

1.join

join方法以传入参数作为分隔符,将数组成员全部连接起来,构成一个字符串.(如果中间有空位,也会被转化为字符串'')

let arr = [1,2,3,4,5]
arr.join('/') // '1/2/3/4/5'
let ar = [1,,3,4]
ar.join('-') // '1--3-4'

由此,join方法我们可以推测它的基本实现:

function join(str) {
    let result = this[0] || result
    let length =  this.length
    for (let i = 1; i < length; i++) {
        result += str + this[i]
    }
    return result
}

2.slice

slice用于截取数组的一部分,然后将该部分数组返回一个新的数组.

arr.slice(start, end)

它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员。如果slice方法的参数是负数,则表示倒数计算的位置。

let arr = [1,2,3]
arr.slice(0) // [1,2,3]
arr.slice(1,2) // [2]
arr.slice(-2) // [2,3]

slice的简单实现:

function slice(begin, end) {
    let result = []
    begin =  begin || 0
    end = end || this.length
    for(let i = start; i < end; i++){
        result.push(this[i])
    }
    return result
    
}

slice可以用来将伪数组转化为真正的数组.

Array.prototype.slice.call(arrayLike)

ES6以后可以使用

array = Array.from(array.like)

伪数组和真数组的区别在于是否拥有Array.prototype.由于没有Array.prototype,伪数组没有push, pop等常用操作.

3 forEach && map

forEach是对数组里的每一项依次执行一个函数

let arr = [1,2,3]
arr.forEach((cur, index, array) => {
    console.log(cur + 1)
})  // [2 , 3, 4]

forEach方法无法中断执行,如果希望中间可以中断,那么可以使用for.
forEach的简单实现:

function forEach(fn) {
    for (let i = 0; i < this.length; i++) {
        if (i in this) {
            fn.call(undefined, this[i], i, this)
        }
    }
}

map的实现和forEach相似, 多了一个返回值

function map(fn) {
    let result = []
    for (let i = 0; i < this.length; i++) {
        if (i in this) {
            result[i] = fn.call(undefined, this[i], i, this)
        }
    }
    return result
}

加入使用map, 然后return null,则 map和forEach的作用完全一样.

4.filter

filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组。

let arr = [1,2,3,4]
arr.filter( el => el >= 2) // [2,3,4]

filter的简单实现:

function filter (fn) {
    let result = []
    let temp
    for(let i=0; i < this.length;i++) {
        if (temp = fn.call(undefined,this[i],i,this)) {
            result.push(this[i])
        }
    }
    return result
}

5.reduce

reduce方法依次处理数组的每个成员,最终累计为一个值.可以用来代替一些map和filter的作用.

let arr = [1,2,3,4]
arr.reduce((cur, next)=> cur+next, 0) // 10
arr.reduce((cur,next)=>{ if(cur%2==0) { cur.push(next =) } return result } , [])
arr= array.reduce( (result, v)=> { result.push(v + 1) return result }, [ ] )

reduce的简单实现:

function reduce(fn, init) {
    let result = init
    for(let i=0; i < this.length; i++) {
        if (i in this) {
            result = fn.call(undefined, result, this[i], i , this)
        }
    }
}

你可能感兴趣的:(数组常用操作)