Domanda

C'è un modo per ottenere (da qualche parte) il numero di elementi in un oggetto JavaScript ?? (Cioè tempo costante complessità).

Non posso trovare una proprietà o un metodo che recuperare tali informazioni. Finora posso solo pensare di fare un'iterazione attraverso l'intera collezione, ma questo è il tempo lineare.
E 'strano non v'è alcun accesso diretto alla dimensione dell'oggetto, non credi.

Modifica
Sto parlando l'oggetto Object (non oggetti in generale):

var obj = new Object ;
È stato utile?

Soluzione

Anche se le implementazioni JS potrebbero tenere traccia di un tale valore interno, non c'è alcun modo standard per farlo.

In passato, la variante JavaScript di Mozilla esposto il non -standard __count__, ma è stato rimosso con la versione 1.8.5.

Per lo scripting cross-browser sei bloccato con esplicitamente iterare sulle proprietà e controllando hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

In caso di ECMAScript 5 implementazioni capaci, questo può anche essere scritto come (Complimenti a Avi Lino )

function countProperties(obj) {
    return Object.keys(obj).length;
}

Tenga presente che avrete anche manca proprietà che non sono enumerabili (ad es length di un array).

Se stai usando un framework come jQuery, Prototype, Mootools, $ indipendentemente-the-recente-hype, controllare se vengono con le proprie collezioni API, che potrebbe essere una soluzione migliore al problema di usare oggetti nativi JS .

Altri suggerimenti

Per fare questo in qualsiasi ambiente ES5-compatibile

Object.keys(obj).length

(Browser supportati da href="http://kangax.github.com/es5-compat-table/" qui )
(Doc su Object.keys qui , include il metodo è possibile aggiungere ai browser non ECMA5)

se si sta già utilizzando jQuery in costruzione solo fare questo:

$(yourObject).length

funziona bene per me su oggetti, e ho già avuto jQuery come una dipendenza.

function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

Per quanto ne sappia, non v'è alcun modo per farlo in modo affidabile, a meno che non si passa a un array. Che onestamente, non sembrare strano -. È sembra piuttosto semplice per me che gli array sono numerabili, e gli oggetti non sono

Probabilmente il più vicino si ottiene è qualcosa di simile

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

Ma questo crea problemi, o almeno le domande. Tutte le proprietà creati dall'utente vengono contati, tra cui la funzione _length stessa! E mentre in questo semplice esempio si potrebbe evitare da solo utilizzando una funzione normale, questo non significa che si può smettere di altri script dal fare questo. Allora cosa fai? Ignora proprietà di funzione?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

Alla fine, penso che probabilmente si dovrebbe abbandonare l'idea di rendere gli oggetti numerabili e capire un altro modo per fare qualsiasi cosa tu stia facendo.

Il concetto di numero / lunghezza / dimensionalità non ha molto senso per un oggetto, e che hanno bisogno suggerisce si vuole veramente un Array per me.

Edit: mi ha fatto notare che si desidera un O (1) per questo. Al meglio della mia conoscenza non esiste modo ho paura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top