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

文章目录

1.push

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 返回一个新的数组,包含从 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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 遍历数组返回一个新的数组
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

javascript 复制代码
// 过滤掉满足条件的元素,返回一个新数组
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

javascript 复制代码
// 该函数传入一个函数,返回一个条件,只要有一个元素满足条件就返回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

javascript 复制代码
// 接收一个函数,函数返回一个条件,数组全部返回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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 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

javascript 复制代码
// 返回一个新数组,对元素进行排序,这里简单的对数字进行一下排序,主要是排序思想(冒泡排序)
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

javascript 复制代码
// 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: '胡歌'}

19.reduce

相关推荐
孤寂大仙v1 分钟前
【C++】STL----list常见用法
开发语言·c++·list
她似晚风般温柔7891 小时前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
咩咩大主教1 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
FuLLovers1 小时前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
Jiaberrr2 小时前
前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)
前端·javascript·vue.js·微信小程序·uni-app
everyStudy2 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
城南云小白2 小时前
web基础+http协议+httpd详细配置
前端·网络协议·http
前端小趴菜、2 小时前
Web Worker 简单使用
前端
luthane2 小时前
python 实现average mean平均数算法
开发语言·python·算法
web_learning_3212 小时前
信息收集常用指令
前端·搜索引擎