2013-09-04 17 views
16

Ich versuche, eine Reihe von jQuery Objekten iterieren, durch Erhöhen oder Erniedrigen von 1. Also, für den Erniedrigen Teil verwende ich diesen Code:Wie berechnet man Modulo negativer Integer in JavaScript?

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

so 4 Elemente mit ids ich habe:

div_0 
div_1 
div_2 
div_3 

ich habe erwartet, es als 3 iterieren - 2 - 1 - 0 - 3 - 2 - etc ..

aber es gibt -1 nach dem Null, also steckt es ist. So ist es iteriert wie:

3 - 2 - 1 - 0 - -1 -

steckte ich weiß, dass ich es wahrscheinlich durch Änderung der zweiten Zeile der Code

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

beheben kann, aber ich frage mich, warum JavaScript keine negativen Mods berechnet. Vielleicht hilft das auch einem anderen Coderkollegen.

+0

Es gibt mehrere negative Mod-Lösungen. http://stackoverflow.com/questions/1082917/mod-of-negative-number-is-melting-my-brain – ryan

+1

mögliche Duplikate von [Javascript modulo nicht benehmen] (http://stackoverflow.com/questions/4467539/ javascript-modulo-not-benehmen) –

+0

Sie sollten in Betracht ziehen, Ihre akzeptierte Antwort auf die untere zu ändern, da diese Ihnen eine tatsächliche Lösung für die gestellte Frage bietet. – Marquizzo

Antwort

29

Sie können dies versuchen: p-

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

Check out this

+0

Können Sie erklären, warum Sie zweimal modulo? Ich würde denken, '(this + n)% n' wäre genug. – Marcel

13

Die meisten Sprachen, die von C erben wird ein negatives Ergebnis zurück, wenn der erste Operand einer Modulo-Operation negativ ist und die zweite ist positiv. Ich bin nicht sicher, warum diese Entscheidung ursprünglich getroffen wurde. Vermutlich am ehesten, was die damaligen Prozessoren in der Montage taten. In jedem Fall ist seither die Antwort auf "Warum" am wahrscheinlichsten, "weil Programmierer das wissen, was C erwartet". Die MDC Reference enthält einen Zeiger auf a proposal to introduce a proper mod operator. Aber selbst das würde den existierenden Operator % (den sie "Rest" nennen, um sie besser zu unterscheiden) beibehalten und eine neue Infix-Wortnotation a mod b einführen. Der Vorschlag stammt aus dem Jahr 2011, und ich kenne keine neuen Entwicklungen in dieser Richtung.

+0

Ich erinnere mich, dass C dieses Problem nicht hatte, aber es war lange her. Und ich wusste nicht JavaScript ist ein Nachkomme von C :) Danke für deine Antwort. – jeff

+1

Siehe z.B. [dieses Poster] (http://www.digibarn.com/collections/posters/tongues/ComputerLanguagesChart.png) für Details zur Entwicklung von Programmiersprachen. [Die Wikipedia-Seite] (http://en.wikipedia.org/wiki/ECMAScript) listet auf: "Beeinflusst von Self, HyperTalk, AWK, C, Perl, Python, Java, Schema". – MvG