手写操作js数组的常见方法

1.push

// push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
// 末尾添加,返回的是长度,会改变原数组。
Array.prototype.myPush = function(){
    for(var i = 0; i < arguments.length; i++) {
        this[this.length] = arguments[i]
      }
      return this.length;
}

let a = [1,2,3]
let b = a.myPush(4,5)
console.log(a);//[1,2,3,4,5]

2.pop

// pop() 方法用于删除并返回数组的最后一个元素。
// 返回最后一个元素,会改变原数组。
Array.prototype.myPop = function(){
    // 判断数组是否为空
	if(this.length === 0) return;
	// 先保存最后一个元素
	var atr = this[this.length - 1];
	// 通过设置数组的length属性来实现删除元素的效果
	this.length = this.length - 1;
	return atr;
}
let a = [1,2,3]
let b = a.myPop()
console.log(a);//[1,2,3]
console.log(b);//3

3.unshift

// unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
// 返回新长度,改变原数组。
Array.prototype.myUnshift = function(){
    for (let i = this.length + arguments.length; i >0 ; i--) {
      // 原数组的最后一个等于原数组的最后一个元素,依次减减,arguments没有了就给原数组赋值undefine
      this[i-1] = this[i-arguments.length-1]
    }
    for (let j = 0; j < arguments.length; j++) {
      this[j] = arguments[j]
    }
    // 返回新长度
    return this.length
}
let a = [4,5]
let b =a.myUnshift(1,2,3)
console.log(a);//[1,2,3,4,5]
console.log(b);//5

4.shift

// shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
// 返回第一个元素,改变原数组。
Array.prototype.myShift = function(){
    // 保留第一个元素
    let atr = this[0]
    for (let i = 0; i < this.length ; i++) {
        this[i] = this[i+1]
    }
    this.length = this.length -1
    return atr
}

let a  = [1,2,3] 
let b = a.myShift()
console.log(a);//[2,3]
console.log(b);//[1]

5.slice

// 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
// 返回选定的元素,该方法不会修改原数组。
Array.prototype.mySlice = function(){
    let newArr = []
    let start = arguments[0]
    let end = arguments[1] 
    for (let i = start ; start <= i && i< end; i++) {
        newArr.push(this[i])
    }
    return newArr
}
let a = [1,2,3,4,5,6]
let b = a.mySlice(1,4)
console.log(b);//[2,3,4]

6.splice

// splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。
// 如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。
// splice() 方法会直接对数组进行修改。
Array.prototype.mySplice = function () {
    let start = arguments[0]
    let end = arguments[1]
    let delArr = [] //被删除的元素
    let newArr = [] //没有被删除的元素
    // 如果没有元素需要替换,直接等于undefined
    for (let i = start; i >= start && i < end; i++) {
        // 没有替换元素,返回被删掉的元素
        if (arguments.length < 3) {
            delArr.push(this[i])
            this[i] = undefined
        } else {
            // 替换掉删除的元素
            delArr.push(this[i])
            this[i] = arguments[i - start + 2]
        }
    }
    // 删除元素组未undefine的元素
    for (let j = 0; j < this.length; j++) {
        if (this[j] !== undefined) {
            newArr.push(this[j])
        }
    }
    // 修改元素组
    for (let n = 0; n < newArr.length; n++) {
        this[n] = newArr[n]
        this.length = newArr.length
    }


    return delArr
}

let a = [1, 2, 3, 4, 5, 6]
let b = a.mySplice(0, 3)
console.log(a);//[4,5,6]
console.log(b);//[1,2,3]

let c = [1, 2, 3, 4, 5, 6]
let d = c.mySplice(0, 3,7,8,9)
console.log(c);//[4,5,6]
console.log(d);//[1,2,3]

7.forEach

// forEach 数组遍历
Array.prototype.myForEach = function(fn){
    for (let i = 0; i < this.length; i++) {
        fn(this[i])
    }
}
let items = ['item1','item2','item3']
let copy = []
items.myForEach((items)=>{
    copy.push(items)
})
console.log(copy);

8.map

// 遍历数组返回一个新的数组
Array.prototype.myMap = function(fn){
    let newArr = []
    for (let i = 0; i < this.length; i++) {
       newArr.push(fn(this[i])) 
    }
    return newArr
}

let obj = [
    {
       'name':'胡歌' ,
        'age':40
    },
    {
        'name':'刘德华' ,
        'age':41
    }
]
let res = obj.myMap((item)=>{
    return {
        '姓名':item.name,
        '年龄':item.age
    }
})
console.log(res);//[ { '姓名': '胡歌', '年龄': 40 }, { '姓名': '刘德华', '年龄': 41 } ]

9.filter

// 过滤掉满足条件的元素,返回一个新数组
Array.prototype.myFilter = function(fn){
    let newArr = []
    for (let i = 0; i < this.length; i++) {
        if(fn(this[i])){
            newArr.push(this[i])
        }
    }
    return newArr
}

let a = ['胡歌','刘德华','张学友', '郭富城']
let b = a.myFilter((item)=>item !== '胡歌')
console.log(b);//[ '刘德华', '张学友', '郭富城' ]

10.some

// 该函数传入一个函数,返回一个条件,只要有一个元素满足条件就返回true
Array.prototype.mySome = function(fn){
    let num = []
    for (let i = 0; i < this.length; i++) {
        if(fn(this[i])){
            num.push(this[i])
        }
    }
    if(num.length > 0){
        return true
    }else{
        return false
    }
}

let a = [1,2,3,4,5,6,7,8,9]
let b = a.mySome((item)=>  item < 5)
console.log(b);//true

11.every

// 接收一个函数,函数返回一个条件,数组全部返回ture,则该函数九返回ture
Array.prototype.myEvery = function (fn){
    let num = []
    for (let i = 0; i < this.length; i++) {
        // 满足条件的个数
        if(fn(this[i])){
            num.push(this[i])
        }
    }
    // 如果满足条件的元素与原数组的元素一样,返回ture,否则返回false
    if(num.length == this.length){
        return true
    }else {
        return false
    }
}


let a = [1,2,3,4,5,6,7]
let b = a.myEvery((item)=>{
    return item < 8
})
console.log(b);

12.concat

// concat() 方法用于连接两个或多个数组。
// 该方法不会改变现有的数组,仅会返回被连接数组的一个副本。
Array.prototype.myConcat  = function(oldArr){
    let newArr = this
    for (let i = 0; i < oldArr.length; i++) {
        newArr.push(oldArr[i])
    }
    return newArr
}

let a = [1,2,3]
let b = [4,5,6]

let c =  a.myConcat(b)
console.log(c);//[1,2,3,4,5,6]


13.join

// join() 方法用于把数组中的所有元素放入一个字符串。
// 元素是通过指定的分隔符进行分隔的,默认使用’,'号分割,不改变原数组
Array.prototype.myJoin = function(){
    let string =''
    for (let i = 0; i < this.length; i++) {
        string += this[i]
    }
    return string
}
let a = [1,2,3,4,5,6]
let b = a.myJoin()
console.log(b);//'123456'

14.indexOf

// indexOf(查找的元素,从第几个元素开始) 方法可返回数组或字符串中某个指定的元素位置。
// 该方法将从头到尾地检索数组,看它是否含有对应的元素。开始检索的位置在数组 start 处或数组的开头(没有指定 start参数时)。如果找到一个 item,则返回 item 的第一次出现的位置。
// 如果在数组中没找到指定元素则返回 -1。

Array.prototype.myIndexOf = function(){
    for (let i = arguments[1]; i < this.length; i++) {
        if(this[i] == arguments[0]){
            return i
        }
    }
    return -1
}
let a = [1,2,3,4,5,6]
let b = a.myIndexOf(4,3)
console.log(b);//3

15.lastIndexOf

// indexOf(查找的元素,从第几个元素开始) 方法可返回数组或字符串中某个指定的元素位置。
// 该方法将从尾到头地检索数组,看它是否含有对应的元素。如果找到一个 item,则返回 item 的第一次出现的位置。
// 如果在数组中没找到指定元素则返回 -1。

Array.prototype.myIndexOf = function(){
    for (let i = arguments[1] ; i >= 0; i--) {
        if(this[i] == arguments[0]){
            return i
        }
    }
    return -1
}
let a = [1,2,3,4,5,6]
let b = a.myIndexOf(2,3)
console.log(b);//3

16.reserve

// reverse() 方法用于颠倒数组中元素的顺序。返回的是颠倒后的数组,会改变原数组
Array.prototype.myReverse = function(){
    let newArr = []
    for (let i = this.length - 1; i >= 0; i--) {
        newArr.push(this[i])
    }
    return newArr
}

let a = [1,2,3,4,5,6]
let b = a.myReverse()
console.log(b);//[ 6, 5, 4, 3, 2, 1 ]

17.sort

// 返回一个新数组,对元素进行排序,这里简单的对数字进行一下排序,主要是排序思想(冒泡排序)
Array.prototype.mySort = function(fn){
    // 升序
    if(fn(2,1) == 1){
        // 第一轮遍历
        for (let i = 0; i < this.length; i++) {
            // 第二轮遍历
            for (let j = 0; j < this.length; j++) {
                // 第i个元素与下一个元素进行对比,交换位置
                let tem 
                if(this[j] > this[j+1] ){
                    // 升序
                    tem = this[j] 
                    this[j] = this[j+1]
                    this[j+1] =tem
                }
            }
        }
        // 降序
    }else{
        // 第一轮遍历
        for (let i = this.length -1; i >= 0; i-- ){
            // 第二轮遍历
            for (let j = this.length -1; j >=0 ; j--) {
                // 第i个元素与下一个元素进行对比,交换位置
                let tem 
                if(this[j] > this[j-1] ){
                    // 升序
                    tem = this[j] 
                    this[j] = this[j-1]
                    this[j-1] =tem
                }
            }
        }
    }
    
    return this
}

let a = [2,6,1,3,5,0]
// 升序
let b = a.mySort((a,b)=> a-b)
// 降序
// let c = a.mySort((a,b)=> b-a)
console.log(b);
// console.log(c);


18.find

// find() 方法是 JavaScript 中用于在数组中查找特定条件的第一个元素,如果找到一个元素使得回调函数返回true,
// 则该元素作为结果返回;如果没有找到这样的元素,则返回undefined,该函数不会修改原始数组。
Array.prototype.myFind = function(fn){
    for (let i = 0; i < this.length; i++) {
        if(fn(this[i])){
            return this[i]
        }
    }
}
let a = [
    {id: 1, name: '刘德华'},
    {id: 2, name: '胡歌'},
    {id: 3, name: '刘华强'}]
let b = a.myFind((item)=> item.id == 2)
console.log(b);// {id: 2, name: '胡歌'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忧郁火龙果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值