2013-09-04 14 views
16

Sto cercando di iterare su un array di oggetti jQuery, per incremento o decremento di 1. Così, per la parte decremento, io di questo codice:Come calcolare il modulo degli interi negativi in ​​JavaScript?

var splitted_id = currentDiv.attr('id').split('_'); 
var indexOfDivToGo = parseInt(splitted_id[1]); 
indexOfDivToGo = (indexOfDivToGo-1) % allDivs.length; 
var divToGo = allDivs[indexOfDivToGo]; 

così ho 4 elementi con id:

div_0 
div_1 
div_2 
div_3 

mi aspettavo di iterare come 3-2 - 1-0 - 3-2 - ecc ..

ma restituisce -1 dopo lo zero, quindi è bloccato. Così itera come:

3 - 2 - 1 - 0 - -1 - bloccato

So che posso probabilmente risolvere il problema cambiando la seconda linea del mio codice per

indexOfDivToGo = (indexOfDivToGo-1 + allDivs.length) % allDivs.length; 

ma io mi chiedo perché JavaScript non stia calcolando le mod negative. Forse questo aiuterà un altro coder fellow.

+0

Esistono diverse soluzioni mod negative. http://stackoverflow.com/questions/1082917/mod-of-negative-number-is-melting-my-brain – ryan

+1

possibile duplicato di [modulo JavaScript che non si comporta] (http://stackoverflow.com/questions/4467539/ javascript-modulo-not-behaving) –

+0

Dovresti considerare di cambiare la tua risposta accettata a quella in basso, poiché ti dà una soluzione reale alla domanda posta. – Marquizzo

risposta

29

Si può provare questo: p-

Number.prototype.mod = function(n) { 
    return ((this % n) + n) % n; 
} 

Partenza this

+0

Puoi spiegare perché si modulo due volte? Penserei che '(questo + n)% n' sarebbe sufficiente. – Marcel

13

maggior parte dei linguaggi che ereditano da C restituirà un risultato negativo se il primo operando di un'operazione di modulo è negativo e il secondo è positivo. Non sono sicuro del motivo per cui questa decisione è stata presa in origine. Probabilmente il più vicino a quello che i processori in quel momento facevano in assemblea. In ogni caso, da allora la risposta al "perché" è più probabile "perché è quello che i programmatori che sanno di C si aspettano".

Il MDC Reference contiene un puntatore a a proposal to introduce a proper mod operator. Ma anche questo manterrebbe l'operatore esistente % (che chiamano "resto" per distinguere meglio tra di loro) e introdurre una nuova notazione di parole infisso a mod b. La proposta risale al 2011 e non conosco altri sviluppi recenti in questa direzione.

+0

Ricordo che C non aveva questo problema, ma era molto tempo fa. E non sapevo che JavaScript fosse un discendente di C :) Grazie per la tua risposta. – jeff

+1

Vedere per es. [questo poster] (http://www.digibarn.com/collections/posters/tongues/ComputerLanguagesChart.png) per i dettagli sull'evoluzione dei linguaggi di programmazione. [La pagina di Wikipedia] (http://en.wikipedia.org/wiki/ECMAScript) elenca: "Influenzato da Self, HyperTalk, AWK, C, Perl, Python, Java, Scheme". – MvG

Problemi correlati