电脑计算机论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 624|回复: 0

重写数组的方法(改变原数组)

[复制链接]
薛定谔的猫 发表于 2022-9-9 13:16:00 | 显示全部楼层 |阅读模式
重写数组的方法(改变原数组)
下图是我自我学习模拟数组时总结的一些重新数组的方法:
本文我们暂不讨论不改变原数组的方法,只谈改变原数组用到的 6 种方法。
改变原数组的方法
push()
按参数顺序向数组尾部添加元素,返回新数组的长度
var color = ['red', 'green']
var color2 = color2.push(['blue','purple'])

alert(color)    // ['red', 'green']
alert(color2)    // ['red', 'green','blue','purple']
重写:
Array.prototype._push = function() {
    for(let i = 0; i < arguments.length; i++) {
        this[this.length] = arguments
    }
    return this.length
}

var arr1 = [1, 2, 3]
console.log(arr1.push(4, 5))    // 返回新数组的长度  5
console.log(arr1._push(6, 7))   // 返回新数组的长度  7
console.log(arr1)    // [1, 2, 3, 4, 5, 6, 7]
pop()
删除数组中的最后一个元素,并返回该元素
var color = ['red', 'green','blue','purple']
var color2 = color.pop()

alert(color)    // ['red','green','blue']
alert(color2)    // ['purple']
Array.prototype._pop() = function() {
    if(this.length) {
        let res = this[this.length - 1]
        delete this[this.length]
        this.length--
        return res
    }
}

let arr2 = [1, 2, 3, 4, 5]
console.log(arr2.pop())    // 返回删除的元素 5
console.log(arr2._pop())    // 返回删除的元素 4
console.log(arr2)    // [1, 2, 3]
sort()
默认情况下,sort () 会按照升序重新排列数组元素,即最小的值在前面,最大的值在后面。因此,sort () 会在每一项上调用 string () 转换函数,然后比较字符串来决定顺序。即使数组的元素都是数值,也会先把数组转换成字符串再比较、排序。例如:
let values = [0, 1, 5, 10, 15]
values.sort()
console.log(values)   //0,1,10,15,5
一开始数组中的数值的顺序是正确的,但是调用 sort () 会按照这些数值的字符串形式重新排序。所以它可以接收一个比较函数,用于判断哪个值应该排在前面。
function compare(a, b) {
   if(a < b) return -1
   else if(a > b)  return 1
   else return 0
}
这个比较函数可以适用于大多数数据类型,可以把他当做参数传给 sort (),例如:
let values = [0, 1, 5, 10, 15]
values.sort(compare)
console.log(values)   // 0,1,5,10,15
当然,也可以使排序产生降序效果,只需要把返回值交换一下即可:
function compare(a, b) {
   if(a < b) return 1
   else if(a > b)  return -1
   else return 0
}

let values = [0, 1, 5, 10, 15]
values.sort(compare)
console.log(values)   // 15,10,5,1,0
重写:
var arr = [4, 1, 6, 9, 3, 2, 8, 7]
var arr2 = [4, 1, 6, 9, 3, 2, 8, 7]
console.log(arr.sort());

Array.prototype.mySort = function (arr) {
   for (var i = 0; i < this.length; i++) {
      for (var j = i + 1; j < this.length; j++) {
         if (this > this[j]) {
            var temp = this
            this = this[j]
            this[j] = temp;
         }
      }
   }
   return this
}

console.log('mySort:',arr2.mySort());
reverse()
将数组倒叙,改变原数组
Array.prototype.myReverse = function () {
   var left = 0,
      right = this.length - 1;

   while (left < right) {
      var temp = this[left];
      this[left] = this[right];
      this[right] = temp;
      left++;
      right--;

   }
}
var arr2 = [1, 3, 5, 7, 9]
console.log('before:', arr2)  
myReverse(arr2)
console.log('after:', arr2)
shift()
删除数组第一个元素,并返回该元素
var arr = [1, 3, 5, 7]
console.log(arr.unshift(9))
console.log(arr)

Array.prototype.myUnshift = function () {
   var L = this.length;
   var newArr = arguments.length
   for (var i = L + newArr - 1; i >= 0; i--) {
      if (i > newArr - 1) {
         this = this[i - newArr];
      } else {
         this = arguments;
      }
   }
   return this.length;
}

var arr2 = [1, 3, 5, 7,]

console.log('myUnshift:', arr2.myUnshift(9));
console.log('myUnshift:', arr2)
unshift()
向数组开头增加一个或多个元素,并返回新的长度,以上就是我练习时使用的方法,感兴趣的伙伴可在3A的服务器上部署环境,自己进行开发试验。
var arr = [1, 3, 5, 7]
console.log(arr.unshift(9))
console.log(arr)

Array.prototype.myUnshift = function () {
   var L = this.length;
   var newArr = arguments.length
   for (var i = L + newArr - 1; i >= 0; i--) {
      if (i > newArr - 1) {
         this = this[i - newArr];
      } else {
         this = arguments;
      }
   }
   return this.length;
}

var arr2 = [1, 3, 5, 7,]

console.log('myUnshift:', arr2.myUnshift(9));
console.log('myUnshift:', arr2)

您需要登录后才可以回帖 登录 | 注册

本版积分规则


QQ|手机版|小黑屋|电脑计算机论坛 ( 京ICP备2022023538号-1 )

GMT+8, 2024-12-27 09:54 , Processed in 0.096052 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表