JS數(shù)組push、unshift、pop、shift方法的實(shí)現(xiàn)與使用方法示例
本文實(shí)例講述了JS數(shù)組push、unshift、pop、shift方法的實(shí)現(xiàn)與使用方法。分享給大家供大家參考,具體如下:
尾部添加(push)
push() 方法將一個(gè)或多個(gè)元素添加到數(shù)組的末尾,并返回該數(shù)組的新長度。
從解釋中可以看出,push方法只要將要添加的元素依次放到數(shù)組的最后即可,不會改變原有數(shù)組元素的索引。所以循環(huán)參數(shù)列表,將新元素依次放到數(shù)組的最后即可。
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() 方法將一個(gè)或多個(gè)元素添加到數(shù)組的開頭,并返回該數(shù)組的新長度(該方法修改原有數(shù)組)。
向數(shù)組的頭部添加元素,數(shù)組的長度也會發(fā)生變化,但不像尾部添加的操作,數(shù)組原有元素索引不改變。做頭部添加的操作,需要將原有元素的索引向右移動。
例如只添加一位,則需要將數(shù)組的每個(gè)元素的索引依次向右移一位,假設(shè)原來數(shù)組長度是4,頭部添加一個(gè)元素,長度變?yōu)?.
所以現(xiàn)在就變成:array.length = 5
,而目前array[5 - 1]
是最后一個(gè)元素,現(xiàn)在由于依次往后移動,所以,array[5]
必須是最后一個(gè)元素
所以我們可以從數(shù)組的最后一位的下一位往前循環(huán),將array[i]
賦值為array[i - 1]
,循環(huán)到1停止,將array的第0項(xiàng)賦值為需要添加的值。
過程如下
具體代碼實(shí)現(xiàn):
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 ]
但上面的代碼只實(shí)現(xiàn)了一個(gè)元素的頭部添加,unshift方法支持添加多個(gè)元素。例如:
var arr = [1, 2, 3, 4] arr.unshift(8, 7) console.log(arr); // [ 8, 7, 1, 2, 3, 4 ]
針對這樣的情況,需要知道傳入了幾個(gè)參數(shù),可以從arguments對象入手,思路還是上面的思路:
先以最后生成的數(shù)組長度為基準(zhǔn)從后往前循環(huán),依次移動元素,然后將新元素依次放到數(shù)組的頭部
新數(shù)組的長度等于原數(shù)組的長度 + 參數(shù)的個(gè)數(shù),從后往前循環(huán),將原數(shù)組的最后一位,移動到新數(shù)組的最后一位,
因?yàn)樾枰陬^部插入數(shù)量為入?yún)€(gè)數(shù)的元素,所以循環(huán)的起點(diǎn)為原數(shù)組的長度 + 參數(shù)的個(gè)數(shù),循環(huán)的終點(diǎn)為入?yún)⒌膫€(gè)數(shù)。
但由于索引總是比長度少一位,所以起點(diǎn)和終點(diǎn)都需要減1。
現(xiàn)在可以先把循環(huán)移動的邏輯寫出來
Array.prototype._unshift = function(...value) { for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) { this[i] = this[i - arguments.length] } }
再思考一下,由于上一步已經(jīng)移動完了,數(shù)組頭部的位置已經(jīng)空出來了,第二步是有幾個(gè)參數(shù)就要插入幾個(gè)元素。所以現(xiàn)在只需要循環(huán)插入就好:
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 的最后一個(gè)元素,把數(shù)組長度減 1,并且返回它刪除的元素的值。如果數(shù)組已經(jīng)為空,則 pop() 不改變數(shù)組,
并返回 undefined 值。`
這個(gè)很好實(shí)現(xiàn),按照定義一步一步做就可以。首先,記錄下最后一個(gè)元素,便于返回,之后從數(shù)組中刪除最后一個(gè)元素,
將其指向null釋放掉,然后將數(shù)組的長度減1,最后判斷一下是否為空數(shù)組。
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() 方法用于把數(shù)組的第一個(gè)元素從其中刪除,并返回第一個(gè)元素的值。
頭部刪除,會改變原有數(shù)組元素的索引,也就是將未被刪除的元素索引都往左移一位,首先要將被刪除的元素記錄下來便于返回,之后將數(shù)組第一個(gè)元素指向null,
最后循環(huán)數(shù)組,移動索引。
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代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《javascript面向?qū)ο笕腴T教程》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
uniapp開發(fā)小程序的開發(fā)規(guī)范總結(jié)
uni-app 是一個(gè)使用 vue.js 開發(fā)跨平臺應(yīng)用的前端框架,下面這篇文章主要給大家介紹了關(guān)于uniapp開發(fā)小程序的開發(fā)規(guī)范,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07JavaScript是否可實(shí)現(xiàn)多線程 深入理解JavaScript定時(shí)機(jī)制
JavaScript的setTimeout與setInterval是兩個(gè)很容易欺騙別人感情的方法,因?yàn)槲覀冮_始常常以為調(diào)用了就會按既定的方式執(zhí)行, 我想不少人都深有同感,2009-12-12javascript簡單實(shí)現(xiàn)類似QQ頭像彈出效果的方法
這篇文章主要介紹了javascript簡單實(shí)現(xiàn)類似QQ頭像彈出效果的方法,可實(shí)現(xiàn)簡單的頁面元素彈出效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08使用PBFunc在Powerbuilder中支付寶當(dāng)面付款功能
這篇文章主要介紹了使用PBFunc在Powerbuilder中支付寶當(dāng)面付款功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10javascript日期字符串轉(zhuǎn)換為時(shí)間戳的5種方法總結(jié)
在JavaScript中將日期字符串轉(zhuǎn)換為時(shí)間戳是一個(gè)常見需求,本文介紹了五種實(shí)現(xiàn)此轉(zhuǎn)換的方法,包括使用Date對象、正則表達(dá)式輔助解析、Date.parse()函數(shù)以及第三方庫如moment.js和date-fns,這些方法適用于不同格式的日期字符串,需要的朋友可以參考下2024-09-09微信小程序開發(fā)之實(shí)現(xiàn)搖色子游戲
這篇文章主要為大家詳細(xì)介紹了如何通過微信小程序開發(fā)一個(gè)簡單的搖色子游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以和小編一起學(xué)習(xí)一下2023-01-01javascript文本框內(nèi)輸入文字倒計(jì)數(shù)的方法
這篇文章主要介紹了javascript文本框內(nèi)輸入文字倒計(jì)數(shù)的方法,涉及javascript針對鍵盤事件的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02