Robust och härlig metod för att få ut “längden” på ett associativt array. Hittat på StackOverflow.
// http://stackoverflow.com/questions/5223/length-of-javascript-associative-array
Object.size = function(obj) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
//Används:
var foo = { bar: true, oh: "hai" };
Object.size(foo); // 2
Tydligen är det farligt att lägga saker på Object.prototype, men att göra såhär skadar ingen.
EDIT
Efter en kommentar och lite testning verkar det som att den här funktionen går att lägga direkt på Object.prototype. Det verkar som att funktionen gör vad den ska, även om man lägger på fler metoder eller egenskaper på Object.property.
Det skulle isåfall se ut såhär:
Object.prototype.size = function() { //Metoden size läggs till på alla objekt... Dvs alla typer
var size = 0, key;
for (key in this) {
if (this.hasOwnProperty(key)) size++;
}
return size;
};
//Används:
var foo = { bar: true, oh: "hai" };
foo.size(); // 2 (size anropas direkt på objektet)
Man bör nog ändå tänka sig för innan man börjar lägga på saker på property-kedjor som är ömtåliga (Function, Object, Array osv), men om man har stor kontroll över sin kod och inga utomstående bibliotek som krockar så ska det här vara relativt ofarligt.
Tack Joacim för kommentaren, alltid kul att få såna. :p
Joacim Ståhl • 2010/10/14
Alltid bra att ha, men hade det inte varit smidigare att köra följande för att kunna kalla på funktionen på alla “object” som skapas?
Object.prototype.size = function() {var size = 0;
for(var key in this) {
if(this.hasOwnProperty(key)) size++;
}
return size;
};
var foo = { bar: true, oh: "hai" };foo.size(); //2Oscar • 2010/10/14
Har faktiskt testat en del nu, och även om man lägger på flera funktioner och properties på
Object.prototypeså returnerarsize-funktionen (lagd på prototype) rätt värde, så ja, det är smidigare, och till synes ofarligt.Det är
hasOwnProperty-metoden som inte bryr sig om vilka properties som är definierade iprototype-kedjan som gör det möjligt.Får uppdatera inlägget med den informationen.
Joacim Ståhl • 2010/10/16
För att undvika krockar brukar jag slänga på en koll innan användning av prototypen, för att precis som du skriver undvika krockar i diverse bibliotek. Nu vet jag ju inte om det ger en falsk linda av trygghet eller om det faktiskt är bra, men man undviker att skriva över något som ett ramverk har gjort och sabba det iaf;
Så i detta fall hade det blivit:
if(typeof(Object.size) == “undefined”)
Oscar • 2010/10/18
Det är helt klart värt att skriva så, men om någon får för sig att implementera en Object.length-metod och implementerar den utan hänsyn till prototype-värden så skulle scripten gå sönder.
Om man är medveten om att det kan bli krockar och underligheter är det bara att köra.