手写操作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

相关推荐
StayInLove2 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道10 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒13 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio23 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE24 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻29 分钟前
WPF中的依赖属性
开发语言·wpf
洋24037 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙39 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点40 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
熊的猫1 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js