2013-03-05 69 views
3

我有一個數組,我只想刪除一個元素,但沒有重新排序鍵。有沒有簡單的方法,而不使用刪除或重建整個陣列?從js數組中刪除值而不重新排序鍵

或者也可以在刪除後清理掉未定義的值,再次固定長度。

var array = ["valueone", "valuetwo"]; 

console.dir(array); // keys 0 and 1 
array.splice(0, 1); 
console.dir(array); // key 1 is now 0, do not want! 
+3

你有什麼反對使用刪除? – j08691 2013-03-05 21:54:12

+0

不知道我明白你是什麼意思的「刪除」,但你不能只是使用一個像聲明數組[索引] = undefined;或array [index] = null; ? – 2013-03-05 21:54:25

+1

你爲什麼想這樣做? – AD7six 2013-03-05 21:56:01

回答

3

可以delete數組的元素:

a = ['one', 'two']; 
delete a[0]; 

// a is now [undefined, 'two']; 

可替代地,設置a[0]明確地undefined

請注意,系統會自動維護一個數組參數.length。如果您有意將其設置爲一個較大的數字,你會只得到undefined值的整個負載爲丟失的鑰匙:

a.length = 10; 
// a is now [undefined, 'two', undefined x 8] 

如果這些語義不接受你,那麼你應該考慮使用Object代替。這將保留你的鑰匙,也許更有效率,但你失去了財產。

+0

「是否有簡單的方法**而不使用刪除**或重建整個陣列?」 – j08691 2013-03-05 21:54:54

+0

@ j08691是的,我錯過了那一點。不過,這是一種人爲的限制。元素的索引仍然存在,只有一個「undefined」值。 – Alnitak 2013-03-05 21:56:03

+0

很好的答案,非常感謝。顯然,我應該轉向一個對象,並通過其他方式跟蹤它的元素。 – Nuoun 2013-03-05 22:15:30

1

難道你不能明確地將值設置爲undefined或null或空字符串。你想達到什麼目的?

var arr = ['aaaa','bbb','ccc','ddd']; 
    arr[0]= undefined; 
    //or 
    arr[0]= null; 
    ///or 
    arr[0]= ""; 
    arr.length; <--- 4 
+0

'.length'不是函數... – Alnitak 2013-03-05 22:01:52

+0

我想使用數組的長度,這對於未定義的值是不正確的。另外我有點擔心它會因爲每次擊鍵都添加鍵值而「填滿」關鍵值。但顯然,一個對象是去這裏的路。 – Nuoun 2013-03-05 22:07:59

+0

你確定,我只是測試,甚至當分配一個undefined,我仍然得到4. – 2013-03-06 07:52:06

0

您可以使用javascript的delete關鍵字。

delete array[index]; 

不幸的是,這裏面創建數組的

var arr = ['pie', 'cake', 'fish']; 
delete arr[1]; 
arr; // ['pie', undefined, 'fish'] 

undefined指數你也可以這樣做:

var arr = [9,8,7,6]; 
arr[1] = null; 
arr;  // [9,null,7,6] 
arr.length; // 4 
var i = -1; 
while(++i < arr.length){ 
    if(arr[i] && typeof(arr[i] === "number")){ 
     alert(arr[i]); 
    } 
} 

或者,如果你不需要使用數組,你可以使用一個物體,使一切都變得更容易:

var obj = { 
    0: "first", 
    1: "second", 
    2: "third" 
}; 
delete obj[1]; 
obj; // {0: "first", 2: "third"} 
for(var i in obj){ 
    alert(obj[i]); 
} 

要獲得一個物體的長度:

getLength = function(obj){ 
    var i = 0, l = 0; 
    for(i in obj){ 
     l++; 
    } 
    return l; 
} 
getLength(obj); // 3 

但請記住,通過date of creation對象進行排序的指標,叫不上名字。不過,這不應該導致路障。

將對象按字母順序的排序指標:

sortObject = function(){ 
    var arr = [], i; 
    for(i in this){ 
     arr.push({index:i,content:this[i]}); 
     delete this[i]; 
    } 
    arr.sort(); 
    for(i in arr){ 
     var item = arr[i]; 
     this[item.index] = item.content; 
    } 
    return this; // make chainable 
} 
var obj = { 
    acronym: "OOP", 
    definition: "Object-Oriented Programming", 
    article: "http://wikipedia.org/OOP" 
}; 
sortObject.apply(obj); // indices are "acronym", "article", "definition" 

希望這有助於

+0

驚人的長度。這幫了很多,謝謝! – Nuoun 2013-03-06 00:06:42

+0

@Nuoun歡迎您:)很高興它幫助! – 2013-03-06 01:53:02