2013-07-19 140 views
0

我對JS delete()函數有點麻煩。按索引刪除數組

直接從Chrome檢查:

> x = [{name: 'hello'}, {name: 'world'}] 
> [Object, Object] 
> delete x[0] 
> true 
> $.each (x, function (i, o) {console.log(o.name);}) 
> TypeError: Cannot read property 'name' of undefined 
> x 
> [undefined × 1, Object] 

你有任何想法,爲什麼發生這種情況?它導致我的問題each

回答

0

Array數據結構上的delete()方法有點誤導。當您執行以下操作時:

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

delete()的作用與將數組元素分配給undefined類似。請注意,使用刪除()之後,該陣列不偏移和長度保持不變:

a.length -> 3 
a[0] -> undefined 

所以在本質上,刪除()創建一個稀疏陣列和不改變長度屬性也不刪除元素。要完全刪除元素,要做到以下幾點:

a.splice(0,1) 

這都將刪除元素,改變數組的長度屬性。所以現在:

a.length -> 2 

有關方法參數的詳細信息,請參閱splice方法。

+0

我會考慮拼接。 我更喜歡'delete()',因爲我刪除了'each()'中的項目。 – ep0

+0

在數組上迭代時刪除元素的意圖是什麼? – stavarotti

+0

我有一個列表中的元素(最初是空的,然後添加到它)。這些元素有一個「數量」字段 現在我通過添加更多元素來更新該列表。 對於Limbo中的每個存在元素,我更新數量,對於不存在的元素,我將它們與'quantity' = 1相加。 我迭代要添加的元素,並且如果我在Limbo中找到它,我增加'數量'並刪除項目。 迭代完成後,我所擁有的就是需要添加的元素,所以我曾經迭代過。 – ep0

1

刪除x[0]是不同的切片數組中的條目。元素1仍然在x[1]換句話說,所以x[0]undefined

1

若要從陣列中正確刪除對象,應使用splice method

x = [{name: 'hello'}, {name: 'world'}]; 
x.splice(0,1);