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 相关文章推荐
JavaScript遍历table表格中的某行某列并打印其值
Jul 08 Javascript
jQuery中outerWidth()方法用法实例
Jan 19 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
Aug 24 Javascript
javascript闭包功能与用法实例分析
Apr 06 Javascript
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
Vue响应式原理深入解析及注意事项
Dec 11 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
Sep 01 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
通过实例了解js函数中参数的传递
Jun 15 Javascript
解决vant-UI库修改样式无效的问题
Nov 03 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP 透明水印生成代码
2012/08/27 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
JavaScript 拾漏补遗
2009/12/27 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
简单学习Python time模块
2016/04/29 Python
Python使用剪切板的方法
2017/06/06 Python
Python实现登录接口的示例代码
2017/07/21 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
python中import与from方法总结(推荐)
2019/03/21 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
python实现tail -f 功能
2020/01/17 Python
python实现最速下降法
2020/03/24 Python
如何使用Pytorch搭建模型
2020/10/26 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
群众路线教育实践活动方案
2014/02/02 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
销售经理工作检讨书
2015/02/19 职场文书
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
Oracle中update和select 关联操作
2022/01/18 Oracle