2013-09-21 13 views
5

Abbiamo un ciclo come questo:Come identificare la prima iterazione in un ciclo for..in

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop) { 
     // Here need operation only for first iteration (1) 
     // Other operations 
    } 
} 

Come possiamo identificare prima iterazione in (1)?

+2

Perché è necessario solo la prima iterazione? Dato che le proprietà non sono garantite per essere elencate in un ordine prevedibile, che cosa stai facendo? –

+0

Vorrei che l'oggetto di controllo abbia almeno una proprietà o meno. Object.keys - buona soluzione ma non supportata IE8. Compilare url dall'oggetto js - per il primo elemento è necessario aggiungere '?' delimitatore, per altro '&'. L'ordine delle chiavi non è importante per me. – karavanjo

risposta

9

Se si può, spostarlo fuori dal giro:

do_one_time_thing(); 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     // Other operations 
    } 
} 

In caso contrario, impostare una bandiera, e più bassa dopo la prima iterazione:

var first_iteration = true; 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     if (first_iteration) { 
      do_one_time_thing(); 
      first_iteration = false; 
     } 
     // Other operations 
    } 
} 
+0

Grazie. Non riesco a spostarlo fuori dal ciclo perché ho bisogno di verificare se l'oggetto ha almeno una proprietà. fardjad ha proposto una soluzione per ottenere le proprietà dell'oggetto. – karavanjo

5

In mancanza di un contatore del ciclo, è necessario tenere traccia da soli:

var first = true; 

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop) { 
     if (first) { 
     first = false; 
     // Here need operation only for first iteration (1) 
     } 
     // Other operations 
    } 
} 
+0

Grazie. Mi chiedo se c'è una soluzione senza usare la bandiera? – karavanjo

+1

Avrai bisogno di una bandiera * da qualche parte *. Senza sapere cosa vuoi fare lì dentro, è difficile dire di più, o capire perché la bandiera è un problema. –

3

Le proprietà non sono garantite per essere elencate in un ordine prevedibile (come altri disse).

Così si può utilizzare Object.keys per ottenere le proprietà dell'oggetto come un array, ordinare quella matrice e ottenere il primo elemento:

var firstProperty = Object.keys(obj).sort()[0]; 
// firstValue = obj[firstProperty]; 
+0

Object.keys - buona soluzione ma non [non è supportato in IE8] (http://kangax.github.io/es5-compat-table/#Object.keys). – karavanjo

1

si Supponendo che non importa quello che il primo elemento è, allora si può usare Object.keys() con .forEach() per evitare l'uso di un flag.

Con questo, non è necessario utilizzare .hasOwnProperty(), perché Object.keys() gestisce quello per te.

Object.keys(obj).forEach(function(key, i) { 
    if (i === 0) { 
     console.log("first", obj[key]); 
    } 
    console.log(obj[key]); 
}); 
0

è possibile utilizzare forEach

array.forEach((element,index) => { 
    if(index==0){ 
     // first element 
     }else{ 
      // not first element 
     } 
     });