Iterando su ogni proprietà di un oggetto in javascript usando Prototype?


89

C'è un modo per iterare su ogni proprietà di un oggetto utilizzando il framework JavaScript Prototype?

Ecco la situazione: ricevo una risposta AJAX in JSON simile a questa:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Se valuto quella risposta json a una variabile response, voglio essere in grado di iterare su ogni proprietà response.barobjnell'oggetto per vedere quali indici sono veri e quali sono falsi.

Il prototipo ha entrambe Object.keys()e, Object.values()stranamente, sembra non avere una Object.each()funzione semplice ! Potrei prendere i risultati di Object.keys () e Object.values ​​() e fare un riferimento incrociato all'altro mentre itero attraverso uno, ma è un tale trucco che sono sicuro che ci sia un modo corretto per farlo!

Risposte:


42

Devi prima convertire il tuo oggetto letterale in un prototipo di hash :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

Perfetto! Questo e 'esattamente quello che stavo cercando.
SovraccaricoUT

57
Sfortunatamente poiché una domanda simile è stata chiusa, una che voleva solo iterare su un semplice oggetto javascript senza Prototype, ora devo trattare questa risposta come se fosse la stessa della domanda che è stata chiusa a causa di "duplicazione". Quindi, esempio orribile in quanto costringe l'utente a caricare Prototype. L'utente non ha detto nulla su Prototype, quindi costringerlo a caricare una libreria indesiderata non è utile. (ricorda, trattalo come se fosse davvero un duplicato). Se l'altra domanda non fosse stata chiusa a causa della falsa affermazione di duplicazione, non avrei dovuto votare la risposta.

2
Il richiedente non ha menzionato che voleva Prototype (o la domanda è stata modificata?)? Comunque va tutto bene
emurano il

Non è necessario caricare una libreria esterna
Healkiss

553

Non c'è bisogno di Prototype qui: JavaScript ha dei for..inloop. Se non sei sicuro che nessuno abbia scherzato Object.prototype, controlla hasOwnProperty()anche, ad es

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
Grazie per la risposta effettiva senza obbligarci a caricare una libreria indesiderata.

8
questa non è la risposta giusta. la domanda afferma che deve essere utilizzato il prototipo! libertà di scelta - haha ​​...
Sven Larson

1
Il titolo originale di questa domanda menzionava Prototipo, che ho aggiunto di nuovo per chiarezza. Questa domanda, come evidenziato dalla primissima linea del corpo, stava specificamente chiedendo di un ambiente in cui Prototype è in uso.
SovraccaricoUT

1
Più scrivi Javascript, più odierai scrivere forloop :)
Trittico

13
Sfortunatamente questa è la domanda che si presenta come # 1 se cerchi qualcosa come "come iterare su ogni javascript di proprietà di un oggetto", quindi molte persone che vengono qui probabilmente stanno cercando la risposta a questa domanda. La domanda che vogliono è questa: stackoverflow.com/questions/921789/… , che in realtà non ha nulla a che fare con i letterali oggetto.
Baxissimo

0

Dovresti iterare sulle chiavi e ottenere i valori usando le parentesi quadre.

Vedi: Come enumerare le proprietà di un oggetto javascript?

EDIT: Ovviamente, questo rende la domanda un duplicato.


Questo metodo è fortemente sconsigliato nei documenti di Prototype: prototypejs.org/api/array
OverloadUT

1
Inoltre, non penso che questo sia un duplicato perché stavo cercando una soluzione nativa del prototipo che è quello che ho ottenuto. L'altra domanda è accettabile per qualcuno che non vuole che utilizzi un framework, ma questa soluzione è molto più sicura se stai usando Prototype.
SovraccaricoUT

1
@OverloadUT: non hai letto abbastanza attentamente: è sconsigliato iterare sulle proprietà degli array, non sugli oggetti semplici
Christoph
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.