Önceki yanıtların hiçbiri, Javascript'in başlangıçta ilişkilendirilebilir dizileri olmadığı gerçeğini ele almaz - array
böyle bir tür yoktur , bkz typeof
.
Javascript'in sahip olduğu, dinamik özelliklere sahip nesne örnekleridir. Özellikler bir Array nesnesi örneğinin öğeleriyle karıştırıldığında, Bad Things ™ gerçekleşir:
Sorun
var elements = new Array()
elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]
console.log("number of elements: ", elements.length) // returns 2
delete elements[1]
console.log("number of elements: ", elements.length) // returns 2 (?!)
for (var i = 0; i < elements.length; i++)
{
// uh-oh... throws a TypeError when i == 1
elements[i].onmouseover = function () { window.alert("Over It.")}
console.log("success at index: ", i)
}
Çözüm
Sizi havaya uçurmayan evrensel bir kaldırma işlevine sahip olmak için şunu kullanın:
Object.prototype.removeItem = function (key) {
if (!this.hasOwnProperty(key))
return
if (isNaN(parseInt(key)) || !(this instanceof Array))
delete this[key]
else
this.splice(key, 1)
};
//
// Code sample.
//
var elements = new Array()
elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]
console.log(elements.length) // returns 2
elements.removeItem("prop")
elements.removeItem(0)
console.log(elements.hasOwnProperty("prop")) // returns false as it should
console.log(elements.length) // returns 1 as it should