2012-06-10 76 views
1

我有一個對象數組,其中的鍵是一個md5字符串,值是一個對象 [0315778255cca8d2f773642ad1d3678f] = {a:12,b:34}。我需要刪除基於他們的關鍵數組元素,我試着拼接,但失敗,因爲我想這些鍵是非數字。 我也嘗試按位置進行拼接,但是失敗了,甚至刪除了元素,但我們都知道它並不理想。使用非數字鍵刪除數組元素

我可以改變我的實現從數組到對象,但也會有相同的問題或多或少我想。

任何想法歡迎

回答

2

splice確實有關陣列索引(作爲陣列的數字屬性的稱呼),不是關於其他屬性。

從對象(包括數組)刪除一個屬性,使用delete

delete theArray['0315778255cca8d2f773642ad1d3678f']; 

儘管它相似的其他語言「刪除」,delete在JavaScript中有沒有(直接)做記憶管理;它所做的就是從對象中刪除一個屬性(完全是這樣;它不會將屬性的值設置爲undefined或其他)。

備註:如果你是只有使用非數字屬性,你可能根本不需要數組。使用JavaScript的Array類型的唯一原因是,如果您需要特殊處理,它會提供名稱均爲數字,屬性爲length(僅與數字屬性相關)的屬性,以及來自Array.prototype的內容  —其中沒有任何內容會執行任何操作其他非索引屬性。


重新下方的評論:

刪除葉中的元素代替不確定的。我需要完全擺脫它

不,delete完全刪除屬性。它不會將undefined代替。您可能會認爲這樣做,因爲任何時候您嘗試從不存在的對象中檢索屬性時,都會返回undefined。例如: -

var obj = {};   // Object with no "foo" property at all 
var x = obj.foo; 
console.log("x = " + x); // "x = undefined" 

可以證明該財產確實是通過使用hasOwnProperty或刪除in

var obj = {}; 
console.log('foo' in obj);    // "false" 
console.log(obj.hasOwnProperty('foo')); // "false" 

in將檢查對象和它的原型鏈; hasOwnProperty只是檢查對象本身。

反觀delete

var obj = {}; 
console.log(obj.hasOwnProperty('foo')); // "false" 
obj.foo = "bar"; 
console.log(obj.hasOwnProperty('foo')); // "true" 
delete obj.foo; 
console.log(obj.hasOwnProperty('foo')); // "false" 
obj.foo = "bar"; 
console.log(obj.hasOwnProperty('foo')); // "true" 
delete obj['foo']; 
console.log(obj.hasOwnProperty('foo')); // "false" 

Live example | source

請注意,如果foo是有效標識符,則delete obj.foo;delete obj['foo'];都可以使用。但是,對於名稱不是有效標識符的屬性(如您的md5總和),您必須像上面顯示的那樣使用帶括號的字符串(delete theArray['0315778255cca8d2f773642ad1d3678f'];)。

+0

delete在元素處留下未定義的元素。我需要完全擺脫它 – mbouclas

+0

@mbouclas:不,它不。我已經添加了答案來解釋你所看到的。 –