JScript內(nèi)置對(duì)象Array中元素的刪除方法
更新時(shí)間:2007年03月08日 00:00:00 作者:
我們知道JScript給我們提供了一個(gè)內(nèi)置的數(shù)組對(duì)象Array。Array對(duì)象除了提供了constructor、length和prototype外,還默認(rèn)提供了13個(gè)方法:concat、join、pop、push、reverse、shift、slice、sort、splice、toLocaleString、toString 、unshift和valueOf,可是沒(méi)有提供delete方法。
要是熟悉JavaScript的話,會(huì)馬上說(shuō),系統(tǒng)提供了一個(gè)delete操作,可以用來(lái)刪除數(shù)組中的元素。對(duì),JS系統(tǒng)里確實(shí)有一個(gè)delete可以刪除數(shù)組中的元素。可是這個(gè)刪除很難用,它確實(shí)可以刪除元素,可是它卻不更新Array對(duì)象的元素計(jì)數(shù)器。例如我們執(zhí)行:
var ary = ['a', 'b', 'c'];
delete ary[1];
如果正確的執(zhí)行刪除后,我們希望會(huì)得到一個(gè)新的數(shù)組,他有兩個(gè)元素['a', 'c'],長(zhǎng)度為2??墒菆?zhí)行完后我們確實(shí)是得到了兩個(gè)元素['a', 'c']的數(shù)組,可是這個(gè)新數(shù)組的長(zhǎng)度ary.length居然還是3!。同時(shí)我們執(zhí)行ary.toString()將得到"a,,c",這也表明數(shù)組的計(jì)數(shù)器還是3,因?yàn)锳rray的toString()實(shí)際上執(zhí)行的是Array.join(',')。
這樣的刪除在我們使用for( ; ; )遍歷數(shù)組的時(shí)候,將會(huì)非常的郁悶,我們可能很容易就可能被一個(gè)undefined的值搞死掉了。那么怎么才能獲得刪除數(shù)組元素后同步數(shù)組的大小呢?由于Array本身提供的pop和shift兩個(gè)函數(shù)可以"真正的"刪除數(shù)組的元素,所以我們可以使用它們來(lái)自己擴(kuò)充一個(gè)remove函數(shù)。
但是pop和shift只能從數(shù)組的兩端刪掉元素,所以我們?cè)趧h除之前需要對(duì)數(shù)組做一些整理,實(shí)現(xiàn)remove方法的代碼如下:
Array.prototype.remove = function(obj)
{
for ( var i=0 ; i < this.length ; ++i )
{
if ( this[i] == obj )
{
if ( i > this.length/2 )
{
for ( var j=i ; j < this.length-1 ; ++j )
{
this[j] = this[j+1];
}
this.pop();
}
else
{
for ( var j=i ; j > 0 ; --j )
{
this[j] = this[j-1];
}
this.shift();
}
break;
}
}
};
移動(dòng)整理數(shù)組的目的只是為了刪除元素后不改變剩余元素的彼此相對(duì)位置,否則只用把需要?jiǎng)h除的元素swap到兩端pop或shift以下就可以了。
要是熟悉JavaScript的話,會(huì)馬上說(shuō),系統(tǒng)提供了一個(gè)delete操作,可以用來(lái)刪除數(shù)組中的元素。對(duì),JS系統(tǒng)里確實(shí)有一個(gè)delete可以刪除數(shù)組中的元素。可是這個(gè)刪除很難用,它確實(shí)可以刪除元素,可是它卻不更新Array對(duì)象的元素計(jì)數(shù)器。例如我們執(zhí)行:
var ary = ['a', 'b', 'c'];
delete ary[1];
如果正確的執(zhí)行刪除后,我們希望會(huì)得到一個(gè)新的數(shù)組,他有兩個(gè)元素['a', 'c'],長(zhǎng)度為2??墒菆?zhí)行完后我們確實(shí)是得到了兩個(gè)元素['a', 'c']的數(shù)組,可是這個(gè)新數(shù)組的長(zhǎng)度ary.length居然還是3!。同時(shí)我們執(zhí)行ary.toString()將得到"a,,c",這也表明數(shù)組的計(jì)數(shù)器還是3,因?yàn)锳rray的toString()實(shí)際上執(zhí)行的是Array.join(',')。
這樣的刪除在我們使用for( ; ; )遍歷數(shù)組的時(shí)候,將會(huì)非常的郁悶,我們可能很容易就可能被一個(gè)undefined的值搞死掉了。那么怎么才能獲得刪除數(shù)組元素后同步數(shù)組的大小呢?由于Array本身提供的pop和shift兩個(gè)函數(shù)可以"真正的"刪除數(shù)組的元素,所以我們可以使用它們來(lái)自己擴(kuò)充一個(gè)remove函數(shù)。
但是pop和shift只能從數(shù)組的兩端刪掉元素,所以我們?cè)趧h除之前需要對(duì)數(shù)組做一些整理,實(shí)現(xiàn)remove方法的代碼如下:
Array.prototype.remove = function(obj)
{
for ( var i=0 ; i < this.length ; ++i )
{
if ( this[i] == obj )
{
if ( i > this.length/2 )
{
for ( var j=i ; j < this.length-1 ; ++j )
{
this[j] = this[j+1];
}
this.pop();
}
else
{
for ( var j=i ; j > 0 ; --j )
{
this[j] = this[j-1];
}
this.shift();
}
break;
}
}
};
移動(dòng)整理數(shù)組的目的只是為了刪除元素后不改變剩余元素的彼此相對(duì)位置,否則只用把需要?jiǎng)h除的元素swap到兩端pop或shift以下就可以了。
您可能感興趣的文章:
相關(guān)文章
Three.js使用OrbitControls后修改相機(jī)旋轉(zhuǎn)方向無(wú)效解決辦法
three.js是用javascript寫(xiě)的基于webGL的第三方3D庫(kù),下面這篇文章主要給大家介紹了關(guān)于Three.js使用OrbitControls后修改相機(jī)旋轉(zhuǎn)方向無(wú)效的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01微信小程序?qū)崿F(xiàn)星星評(píng)價(jià)效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)星星評(píng)價(jià)效果,支持多個(gè)條目評(píng)價(jià),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11面向JavaScript入門初學(xué)者的二叉搜索樹(shù)算法教程
二叉搜索樹(shù)則是二叉樹(shù)的一種,但它只允許你在左側(cè)節(jié)點(diǎn)儲(chǔ)存比父節(jié)點(diǎn)小的值,右側(cè)只允許儲(chǔ)存比父節(jié)點(diǎn)大的值,這篇文章主要給大家介紹了關(guān)于JavaScript二叉搜索樹(shù)算法的相關(guān)資料,需要的朋友可以參考下2021-09-09JavaScript中的純函數(shù)與偏函數(shù)你了解嗎
JS中,純函數(shù)指在相同的輸入下始終產(chǎn)生相同的輸出并且沒(méi)有副作用的函數(shù),偏函數(shù)指一種創(chuàng)建新函數(shù)的方法,通過(guò)預(yù)設(shè)一個(gè)或多個(gè)參數(shù)從而實(shí)現(xiàn)對(duì)原始函數(shù)的封裝和定制,本文主要來(lái)講講純函數(shù)與偏函數(shù)的一些使用,需要的可以參考一下2023-05-05bootstrap datepicker限定可選時(shí)間范圍實(shí)現(xiàn)方法
這篇文章主要介紹了bootstrap datepicker限定可選時(shí)間范圍的實(shí)現(xiàn)方法,本文涉及到相關(guān)知識(shí)點(diǎn),通過(guò)實(shí)例給大家介紹的非常詳細(xì),需要的朋友可以參考下2016-09-09JS實(shí)現(xiàn)圖片高亮展示效果實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)圖片高亮展示效果的方法,實(shí)例分析了JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)操作頁(yè)面元素樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11