Domanda

Non so come estendere l'oggetto della mappa con prototipi e spero che tu possa aiutare. Ho qualcosa di simile:

var map = {'one':1, 'two':2};

e vorrei avere un metodo per verificare l'esistenza di una chiave:

if (map.containsKey('one')){...}

Come faccio a estendere l'oggetto mappa?

È stato utile?

Soluzione

E 'pericoloso modificare Object.prototype , in quanto colpisce tutti gli oggetti e di solito rompere altre librerie che si sta utilizzando . In generale, se si desidera aggiungere metodi a un oggetto simile ai dizionari, è necessario creare un oggetto per le istanze di hash di ereditare da, come l'oggetto prototipo Hash .

Per questo caso specifico, si dovrebbe in realtà solo utilizzare if (key in map) o if (map.hasOwnProperty(key)).

Altri suggerimenti

C'è già un operatore per verificare l'esistenza di una chiave all'interno di un oggetto.

(in JavaScript, gli oggetti vengono implementati come mappe in modo in realtà non c'è una vera mappa.)

if( 'one' in map ) 
{
   alert(map['one']);
}

Non si tratta di "mappe" sono oggetti. Sulla risposta di Maurice, se si vuole che questo si applica a tutti gli oggetti:

Object.prototype.containsKey = function(key) {
    return this.hasOwnProperty(key);
};

Il modo più semplice per farlo è quello di aggiungere una funzione direttamente nell'oggetto:

map.containsKey = function(key) {
    return this[key] ? true : false;
};

In Javascript, non avete bisogno di tale metodo davvero.

if ( map['one'] ) {
   // do something
}

dovrebbe farlo

Come altri hanno detto, che si estende Object.prototype potrebbe non essere una buona idea se il codice ha di bel gioco con il codice scritto da persone ignoranti di hasOwnProperty().

In ogni caso, ci sono tre modi 'corretta' che conosco per verificare se una proprietà è disponibile:

obj.hasOwnProperty(name)

controlla se una proprietà con data nome esiste nell'oggetto.

name in obj

include inoltre le proprietà ereditate tramite catena di prototipi di un oggetto.

typeof obj[name] !== 'undefined'

verrà inoltre valutata come false se la proprietà è presente, ma è stato impostato su undefined.

di (per esempio window.external in IE) potrebbe non attuare <=>, Sufficiente JS non oggetto così uno degli altri controlli deve essere utilizzato.

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