2012-07-13 3 views
7

Mi chiedevo quale sarebbe stato il modo migliore per convertire (da Python) una lista di comprensione in Javascript. C'è qualcosa che renderà questo leggibile e non un disastro?Comprensione array in JavaScript?

non_zero_in_square = [ grid[row][col] 
          for row in range(start_row, start_row+3) 
          for col in range(start_col, start_col+3) 
          if grid[row][col] is not 0 
         ] 

questo è abbastanza un buon esempio di un elenco di comprensione, poiché possiede una varietà for s ed e un if.

Vorrei aggiungere che il bit range è coperto here (non posso vivere senza range).

+3

In qualità di sviluppatore JavaScript che non saprebbe Python se ne è venuto in su per una chiacchierata alla fermata dell'autobus, che è un po 'la sintassi asino funky voi Pythonisti hai lì. – Utkanos

+2

Si noti che JavaScript 1.7 ha [Array Comprehension] (https://developer.mozilla.org/en/New_in_JavaScript_1.7#Array_comprehensions_%28Merge_into_Array_comprehensions%29), sfortunatamente sono implementate solo in Firefox al momento. Spero che presto lo troveremo anche in altri browser (vedi [harmony] (http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions) – ZER0

risposta

3

Beh, sarebbe un po 'complicato farlo con il metodo .map(), perché le chiamate esterne devono davvero restituire gli array. Quindi probabilmente stai meglio con il pedone:

var nonZero = []; 
for (var row = startRow; row < startRow + 3; ++row) 
    for (var col = startCol; col < startCol + 3; ++col) 
    if (grid[row][col] !== 0) nonZero.push(grid[row][col]; 
+0

Giusto. Inoltre lo includerei in un self-executing funzione assegnata alla variabile per proteggere 'nonZero' – elclanrs

+1

@elclanrs yes Sono d'accordo, questo presuppone una specie di scope simile all'OP, ma se fosse una sorta di strumento allora' nonZero' dovrebbe essere una variabile locale. – Pointy

2

Sintassi di comprensione dell'elenco di supporto per script di caffè ed è probabilmente il più accurato in quanto segue esattamente la sintassi. Purtroppo è un intermediario e sarebbe compilato per multilinea javascript

http://coffeescript.org/#loops

vi mostrano come si ripari a vanilla javascript.