天天看點

JScript内置對象Array中元素的删除問題

  我們知道JScript給我們提供了一個内置的數組對象Array。Array對象除了提供了constructor、length和prototype外,還預設提供了13個方法:concat、join、pop、push、reverse、shift、slice、sort、splice、toLocaleString、toString

、unshift和valueOf,可是沒有提供delete方法

JScript内置對象Array中元素的删除問題

要是熟悉JavaScript的話,會馬上說,系統提供了一個delete操作,可以用來删除數組中的元素。對,JS系統裡确實有一個delete可以删除數組中的元素。可是這個删除很難用,它确實可以删除元素,可是它卻不更新Array對象的元素計數器。例如我們執行:

JScript内置對象Array中元素的删除問題

var ary = ['a', 'b', 'c'];

JScript内置對象Array中元素的删除問題

delete ary[1];

    如果正确的執行删除後,我們希望會得到一個新的數組,他有兩個元素['a', 'c'],長度為2。可是執行完後我們确實是得到了兩個元素['a', 'c']的數組,可是這個新數組的長度ary.length居然還是3!

JScript内置對象Array中元素的删除問題

。同時我們執行ary.toString()将得到"a,,c",這也表明數組的計數器還是3,因為Array的toString()實際上執行的是Array.join(',')。

這樣的删除在我們使用for( ; ;

)周遊數組的時候,将會非常的郁悶,我們可能很容易就可能被一個undefined的值搞死掉了。那麼怎麼才能獲得删除數組元素後同步數組的大小呢?由于Array本身提供的pop和shift兩個函數可以"真正的"删除數組的元素,是以我們可以使用它們來自己擴充一個remove函數。

    但是pop和shift隻能從數組的兩端删掉元素,是以我們在删除之前需要對數組做一些整理,實作remove方法的代碼如下:

JScript内置對象Array中元素的删除問題

Array.prototype.remove = function(obj)

JScript内置對象Array中元素的删除問題

{

JScript内置對象Array中元素的删除問題

    for ( var i=0 ; i < this.length ; ++i )

JScript内置對象Array中元素的删除問題

    {

JScript内置對象Array中元素的删除問題

        if ( this[i] == obj )

JScript内置對象Array中元素的删除問題

        {

JScript内置對象Array中元素的删除問題

            if ( i > this.length/2 )

JScript内置對象Array中元素的删除問題

            {

JScript内置對象Array中元素的删除問題

                for ( var j=i ; j < this.length-1 ; ++j )

JScript内置對象Array中元素的删除問題

                {

JScript内置對象Array中元素的删除問題

                    this[j] = this[j+1];

JScript内置對象Array中元素的删除問題

                }

JScript内置對象Array中元素的删除問題

                this.pop();

JScript内置對象Array中元素的删除問題

            }

JScript内置對象Array中元素的删除問題

            else

JScript内置對象Array中元素的删除問題
JScript内置對象Array中元素的删除問題

                for ( var j=i ; j > 0 ; --j )

JScript内置對象Array中元素的删除問題
JScript内置對象Array中元素的删除問題

                    this[j] = this[j-1];

JScript内置對象Array中元素的删除問題
JScript内置對象Array中元素的删除問題

                this.shift();

JScript内置對象Array中元素的删除問題

            }    

JScript内置對象Array中元素的删除問題

            break;

JScript内置對象Array中元素的删除問題

        }

JScript内置對象Array中元素的删除問題

    }

JScript内置對象Array中元素的删除問題

};

    移動整理數組的目的隻是為了删除元素後不改變剩餘元素的彼此相對位置,否則隻用把需要删除的元素swap到兩端pop或shift以下就可以了。

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。

繼續閱讀