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 相关文章推荐
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
JS时间特效最常用的三款
Aug 19 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
Aug 21 jQuery
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
Oct 30 Javascript
vue多个元素的样式选择器问题
Nov 29 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
深入了解NumPy 高级索引
2020/07/24 Python
python温度转换华氏温度实现代码
2020/12/06 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
药品促销活动方案
2014/02/14 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
工程资料员岗位职责
2015/04/13 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript
解析MySQL索引的作用
2022/03/03 MySQL