javascript - Hvordan få lengden på et objekt
Finnes det en innebygd funksjon som kan returnere lengden på et objekt?
For eksempel har jeg a={ 'a':1,'b':2,'c':3 } som skal returnere 3. Hvis jeg bruker a.length returnerer det undefined.
Det kan være en enkel løkkefunksjon, men jeg vil gjerne vite om det finnes en innebygd funksjon?
Det finnes et relatert spørsmål (Lengden på et JSON-objekt) - i det valgte svaret råder brukeren til å gjøre om objektet til et array, noe som ikke er særlig praktisk for oppgaven min.
Svar #1
For nettlesere som støtter Object.keys() kan du enkelt gjøre:
Object.keys(a).length;
Ellers (spesielt i IE < 9), kan du iterere gjennom objektet selv med en for (x in y)-løkke:
var count = 0;
var i;
for (i in a) {
if (a.hasOwnProperty(i)) {
count++;
}
}
hasOwnProperty er der for å sikre at du bare teller egenskaper fra objektlitteralen, og ikke egenskaper det «arver» fra prototypen sin.
Svar #2
Dette burde gjøre det:
Object.keys(a).length
Imidlertid støttes ikke Object.keys i IE8 og eldre, Opera og FF 3.6 og eldre.
Live-demonstrasjon: http://jsfiddle.net/simevidas/nN84h/
Svar #3
Kan enkelt gjøres med $.map():
var len = $.map(a, function(n, i) { return i; }).length;
Svar #4
Har du tatt en titt på underscore.js (http://underscorejs.org/docs/underscore.html)? Det er et verktøybibliotek med mange nyttige metoder. Det finnes en samlingsmetode size, samt en toArray-metode, som kan gi deg det du trenger.
_.size({one : 1, two : 2, three : 3});
=> 3
Svar #5
Oppsummering av alt sammen, her er en universell funksjon (inkludert støtte for ie8):
var objSize = function(obj) {
var count = 0;
if (typeof obj == "object") {
if (Object.keys) {
count = Object.keys(obj).length;
} else if (window._) {
count = _.keys(obj).length;
} else if (window.$) {
count = $.map(obj, function() { return 1; }).length;
} else {
for (var key in obj) if (obj.hasOwnProperty(key)) count++;
}
}
return count;
};
document.write(objSize({ a: 1, b: 2, c: 3 }));
// 3Svar #6
I jQuery har jeg gjort det på en slik måte:
len = function(obj) {
var L=0;
$.each(obj, function(i, elem) {
L++;
});
return L;
}
