2016-10-30 3 views
0

Ich versuche derzeit, eine for in-Schleife zu ersetzen, die ich mit einer regulären for-Schleife aus Neugier, aber mit keinem Erfolg habe. Ich bekomme immer undefined. Ist das überhaupt möglich mit JavaScript-Objekten?ersetze für mit regulär für Schleife mit Objekten

Beispiel Objekt I Schleife über:

var el = { 
    1: {type: "fish", commonName: "clownfish", scientificName: "sdasd", gender: "m", price: 1.99}, 
    2: {type: "fish", commonName: "dragonfish", scientificName: "dada", gender: "f", price: 2.99} 
}; 

Mein Arbeits in Ansatz:

for (var element in el) { 
    if (el[element].type === type && el.hasOwnProperty(element)) { 
     elementNum++; 
    } 
} 

Die einfache for-Schleife Ansatz, der bringt mich immer Cannot read property 'type' of undefined:

for(var i = 0, x = Object.keys(el).length; i < x; i++) { 
    if (el[i].type === type && el.hasOwnProperty(i)) { 
     elementNum++; 
    } 
} 
+1

@Matias hat die richtige Antwort, aber ich frage mich, warum Sie ein Array nicht verwenden? Werden einige Indizes übersprungen oder etwas? Ändere auch die Reihenfolge von '(el [i] .type === type && el.hasOwnProperty (i))', so dass nicht nach '.type 'gesucht wird, wenn' el [i]' nicht existiert (weil javascript aufhört, durch die 'if AND' Aussage zu schauen, wenn sie eine findet, die falsch ist. – Howzieky

Antwort

6

Sie‘ Starten Sie Ihre Schleife von 0 während der erste Schlüssel im gesamten Objekt i s 1.

var el = { 
 
    1: { 
 
    type: "fish", 
 
    commonName: "clownfish", 
 
    scientificName: "sdasd", 
 
    gender: "m", 
 
    price: 1.99 
 
    }, 
 
    2: { 
 
    type: "fish", 
 
    commonName: "dragonfish", 
 
    scientificName: "dada", 
 
    gender: "f", 
 
    price: 2.99 
 
    } 
 
}; 
 

 
var keyLength = Object.keys(el).length; 
 

 
// I've simplified the for loop 
 
for (var i = 1; i <= keyLength; i++) { 
 
    console.log(el[i].commonName); 
 
}

+0

Die Antwort kann nicht kürzer sein. Nice! –

+0

verdammt, wie konnte ich das nicht sehen .. Danke !! – Sebsemillia

+0

@Sebsemillia würde ich betrachten dass mein Verstand manchmal wie ein Sprachhinweiswerkzeug ist (JSHint, JSLint ...) lol –

0

Ich schlage vor, direkt über die Tasten des Objekts iterieren.

function getCount(type) { 
 
    return Object.keys(el).reduce(function (r, k) { 
 
     return r + +(el[k].type === type); 
 
    }, 0); 
 
} 
 

 
var el = { 1: { type: "fish", commonName: "clownfish", scientificName: "sdasd", gender: "m", price: 1.99 }, 2: { type: "fish", commonName: "dragonfish", scientificName: "dada", gender: "f", price: 2.99 } }; 
 

 
console.log(getCount('fish'));

+0

ja, ich kenne diesen Ansatz auch. Ich wollte nur versuchen, es mit einer einfachen for-Schleife zu tun ..;) Danke für Ihre Antwort! – Sebsemillia

+0

es funktioniert nur, wenn das Objekt in einer festen Notation für die Schlüssel ist, wie Indizes. –

Verwandte Themen