JS数组push、unshift、pop、shift方法的实现与使用方法示例


Posted in Javascript onApril 29, 2020

本文实例讲述了JS数组push、unshift、pop、shift方法的实现与使用方法。分享给大家供大家参考,具体如下:

尾部添加(push)

push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。

从解释中可以看出,push方法只要将要添加的元素依次放到数组的最后即可,不会改变原有数组元素的索引。所以循环参数列表,将新元素依次放到数组的最后即可。

Array.prototype._push = function(...value) {
 for (var i = 0; i < arguments.length; i++) {
 this[this.length] = arguments[i]
 }
 return this.length
}
var arr = [1, 2, 3, 4]
arr._push(9, 8)
console.log(arr) // [ 1, 2, 3, 4, 9, 8 ]

头部添加(unshift)

unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。

向数组的头部添加元素,数组的长度也会发生变化,但不像尾部添加的操作,数组原有元素索引不改变。做头部添加的操作,需要将原有元素的索引向右移动。

例如只添加一位,则需要将数组的每个元素的索引依次向右移一位,假设原来数组长度是4,头部添加一个元素,长度变为5.

所以现在就变成:array.length = 5,而目前array[5 - 1]是最后一个元素,现在由于依次往后移动,所以,array[5]必须是最后一个元素

所以我们可以从数组的最后一位的下一位往前循环,将array[i]赋值为array[i - 1],循环到1停止,将array的第0项赋值为需要添加的值。

过程如下

JS数组push、unshift、pop、shift方法的实现与使用方法示例

具体代码实现:

Array.prototype._unshift = function(value) {
 for (let i = this.length; i > 0; i--) {
 this[i] = this[i - 1]
 }
 this[0] = value
 return this.length
}
var arr = [1, 2, 3, 4]
arr._unshift(8)
console.log(arr); // [ 8, 1, 2, 3, 4 ]

但上面的代码只实现了一个元素的头部添加,unshift方法支持添加多个元素。例如:

var arr = [1, 2, 3, 4]
arr.unshift(8, 7)
console.log(arr); // [ 8, 7, 1, 2, 3, 4 ]

针对这样的情况,需要知道传入了几个参数,可以从arguments对象入手,思路还是上面的思路:
先以最后生成的数组长度为基准从后往前循环,依次移动元素,然后将新元素依次放到数组的头部

新数组的长度等于原数组的长度 + 参数的个数,从后往前循环,将原数组的最后一位,移动到新数组的最后一位,

因为需要在头部插入数量为入参个数的元素,所以循环的起点为原数组的长度 + 参数的个数,循环的终点为入参的个数。

但由于索引总是比长度少一位,所以起点和终点都需要减1。

现在可以先把循环移动的逻辑写出来

Array.prototype._unshift = function(...value) {
 for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) {
 this[i] = this[i - arguments.length]
 }
}

再思考一下,由于上一步已经移动完了,数组头部的位置已经空出来了,第二步是有几个参数就要插入几个元素。所以现在只需要循环插入就好:

for(var k = 0; k < arguments.length; k++) {
 this[k] = arguments[k]
}

完整的代码如下:

Array.prototype._unshift = function(...value) {
 for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) {
 this[i] = this\[i - arguments.length]
 }
 for(var k = 0; k < arguments.length; k++) {
 this[k] = arguments[k]
 }
 return this.length
}
var arr = [1, 2, 3, 4\]
arr._unshift(9, 8)
console.log(arr); // [ 9, 8, 1, 2, 3, 4 ]

尾部删除 (pop)

`pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,
并返回 undefined 值。`

这个很好实现,按照定义一步一步做就可以。首先,记录下最后一个元素,便于返回,之后从数组中删除最后一个元素,
将其指向null释放掉,然后将数组的长度减1,最后判断一下是否为空数组。

Array.prototype._pop = function () {
 if (!this.length) {
 return undefined
 }
 var end = this[this.length - 1]
 this[this.length - 1] = null
 this.length = this.length - 1
 return end
}
var arr = [1, 2, 3, 4]
arr._pop()
console.log(arr); // [ 1, 2, 3 ]

头部删除(shift)

shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。

头部删除,会改变原有数组元素的索引,也就是将未被删除的元素索引都往左移一位,首先要将被删除的元素记录下来便于返回,之后将数组第一个元素指向null,

最后循环数组,移动索引。

Array.prototype._shift = function () {
 if (!this.length) {
 return undefined
 }
 var start = this[0]
 this[0] = null
 for(var i = 0; i < this.length - 1; i++) {
 this[i] = this[i + 1]
 }
 this.length = this.length - 1
 return start
}
var arr = [1, 2, 3, 4]
arr._shift()
console.log(arr); // [ 2, 3, 4 ]

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
ajax更新数据后,jquery、jq失效问题
Mar 16 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
Mar 04 Javascript
使用javascript插入样式
Mar 14 Javascript
jQuery使用$.each遍历json数组的简单实现方法
Apr 18 Javascript
AngularJS基础 ng-submit 指令简单示例
Aug 03 Javascript
微信小程序 网络API发起请求详解
Nov 09 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
jQuery实现上传图片前预览效果功能
Aug 03 jQuery
javascript 原型与原型链的理解及应用实例分析
Feb 10 Javascript
JS实现手写 forEach算法示例
Apr 29 #Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 #Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 #Javascript
深入浅析vue全局环境变量和模式
Apr 28 #Javascript
你准备好迎接vue3.0了吗
Apr 28 #Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
Apr 28 #Javascript
JavaScript 禁止用户保存图片的实现代码
Apr 28 #Javascript
You might like
PHP写日志的实现方法
2014/11/05 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
jQuery中remove()方法用法实例
2014/12/25 Javascript
angularJS 入门基础
2015/02/09 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
九种原生js动画效果
2015/11/11 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
Python爬取三国演义的实现方法
2016/09/12 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
运动会广播稿100字
2014/01/11 职场文书
创新比赛获奖感言
2014/02/13 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技