it-swarm.com.de

Gibt es eine bessere Schreibweise für v = (v ==? 1: 0);

Ich möchte eine Variable zwischen 0 und 1 umschalten. Wenn es 0 ist, möchte ich es auf 1 setzen, andernfalls, wenn es 1 ist, möchte ich es auf 0 setzen.

Dies ist eine so grundlegende Operation, dass ich so oft schreibe, dass ich die kürzeste und klarste Möglichkeit untersuchen möchte. Hier ist mein bisher bestes:

v = (v == 0 ? 1 : 0);

Kannst du das verbessern?

Edit: Die Frage ist, wie man die obige Aussage in die wenigsten Buchstaben schreibt und dabei die Klarheit behält - wie ist das "keine wirkliche Frage"? Es war nicht beabsichtigt, eine Code-Golf-Übung zu sein, obwohl einige interessante Antworten von Leuten kamen, die sich dem Golf nähern - es ist schön zu sehen, dass Golf auf konstruktive und zum Nachdenken anregende Weise eingesetzt wird.

450
Ollie Glass

Sie können einfach verwenden:

v = 1 - v;

Dies setzt natürlich voraus, dass die Variable ordnungsgemäß initialisiert wird, d. H. Dass sie nur den Wert 0 oder 1 hat.

Eine andere Methode, die kürzer ist, aber einen weniger verbreiteten Operator verwendet:

v ^= 1;

Bearbeiten:

Deutlich sein; Ich habe diese Frage nie als Code-Golf angegangen, nur um einen kurzen Weg zu finden, um die Aufgabe zu erledigen, ohne irgendwelche Tricks wie Nebeneffekte von Bedienern zu verwenden.

693
Guffa

Da 0 ein false Wert ist und 1 ein true Wert ist.

v = (v ? 0 : 1);

Wenn Sie gerne true und false anstelle von Zahlen verwenden

v = !v;

oder wenn es sich um Zahlen handeln muss:

v = +!v; /* Boolean invert v then cast back to a Number */
340
Quentin

v = (v + 1) % 2 und wenn Sie mehr Werte durchlaufen müssen, ändern Sie einfach 2 für (n + 1). Angenommen, Sie müssen den Zyklus 0,1,2 durchlaufen, tun Sie einfach v = (v + 1) % 3.

199
Prusse

Sie können eine Funktion dafür schreiben und wie folgt verwenden:

v = inv(v)

75
Daniel

Wenn Sie sich nicht für eine andere Möglichkeit als 1 interessieren:

v = v ? 0 : 1;

Im obigen Fall wird v 1, wenn v 0, falsch, undefiniert oder null ist. Seien Sie vorsichtig mit dieser Methode - v wird 0, auch wenn v "Hallo Welt" ist.

50
Brian

Zeilen wie v = 1 - v oder v ^= 1 oder v= +!v werden alle erledigt, aber sie bilden das, was ich als Hacks bezeichnen würde. Dies sind keine schönen Codezeilen, sondern billige Tricks, um die beabsichtigte Wirkung zu erzielen. 1 - v kommuniziert nicht "den Wert zwischen 0 und 1 umschalten". Dies macht Ihren Code weniger ausdrucksstark und führt einen Ort ein (wenn auch einen kleinen), an dem ein anderer Entwickler Ihren Code analysieren muss.

Wenn Sie stattdessen eine Funktion wie v = toggle(v) verwenden, wird die Absicht auf den schnellsten Blick kommuniziert.

44
Ray

Du könntest es tun 

v = Math.abs(--v);

Das Dekrement setzt den Wert auf 0 oder -1 und der Math.abs konvertiert -1 in +1.

35
Paul

wenn Sie zwischen zwei Werten umschalten möchten, können Sie einfach den aktuellen Wert von der Summe der beiden Umschaltwerte abziehen:

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 
34
Mouna Cheikhna

Wenn es sich um die ganze Zahl 1 oder 0 handeln muss, ist die Art, wie Sie es tun, in Ordnung, obwohl keine Klammern benötigt werden. Wenn diese a als Booleans verwendet werden sollen, können Sie einfach Folgendes tun:

v = !v;
33
v = v == 0 ? 1 : 0;

Ist genug !

23
nidhin

Liste der Lösungen

Ich möchte drei Lösungen vorschlagen. Alle konvertieren einen beliebigen Wert in 0 (wenn 1, true usw.) oder 1 (wenn 0, false, null usw.):

  • v = 1*!v
  • v = +!v
  • v = ~~!v

und eine zusätzliche, bereits erwähnte, aber schlau und schnell (obwohl dies nur für 0s und 1s funktioniert):

  • v = 1-v

Lösung 1

Sie können die folgende Lösung verwenden:

v = 1*!v

Dies konvertiert zuerst die Ganzzahl in den entgegengesetzten Booleschen Wert (0 in True und einen anderen Wert in False) und behandelt sie dann als Ganzzahl, wenn sie mit 1 multipliziert wird. Als Ergebnis wird 0 in 1 und alle anderen Werte in 0 konvertiert.

Als Beweis sehen Sie dieses jsfiddle und geben Sie die Werte an, die Sie testen möchten: jsfiddle.net/rH3g5/

Die Ergebnisse sind wie folgt:

  • -123 wird in eine Ganzzahl konvertiert 0,
  • -10 wird in eine Ganzzahl konvertiert 0,
  • -1 wird in eine Ganzzahl konvertiert 0,
  • 0 wird in eine Ganzzahl konvertiert 1,
  • 1 wird in eine Ganzzahl konvertiert 0,
  • 2 wird in eine Ganzzahl konvertiert 0,
  • 60 wird in eine Ganzzahl konvertiert 0,

Lösung 2

Wie mblase75 feststellte, hatte jAndy eine andere Lösung, die als meine funktioniert:

v = +!v

Es macht auch zuerst boolean vom ursprünglichen Wert, verwendet jedoch + anstelle von 1*, um ihn in eine Ganzzahl zu konvertieren. Das Ergebnis ist genau das gleiche, aber die Notation ist kürzer.

Lösung 3

Der andere Ansatz ist die Verwendung des ~~-Operators:

v = ~~!v

Es ist ziemlich ungewöhnlich und wird von boolean immer in eine Ganzzahl konvertiert.

18
Tadeck

Um eine weitere Antwort, einen Kommentar und meine eigene Meinung zusammenzufassen, schlage ich vor, zwei Dinge zu kombinieren:

  1. Verwenden Sie eine Funktion zum Umschalten
  2. Verwenden Sie in dieser Funktion eine besser lesbare Implementierung

Hier ist die Funktion, die Sie in eine Bibliothek einfügen oder für ein anderes Javascript-Framework in ein Plugin packen könnten.

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}

Und die Verwendung ist einfach:

v = inv(v);

Die Vorteile sind:

  1. Keine Code-Duplizierung
  2. Wenn Sie oder jemand dies in Zukunft erneut lesen, werden Sie Ihren Code in kürzester Zeit verstehen.
17

Ich weiß nicht, warum du deine eigenen Booleschen bauen willst? Ich mag die funky-Syntax, aber warum nicht verständlichen Code schreiben?

Dies ist nicht der kürzeste/schnellste, aber der klarste (und für jeden lesbarste) ist der bekannte if/else-Zustand:

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

Wenn Sie wirklich klar sein wollen, sollten Sie hierfür Booleans anstelle von Zahlen verwenden. Sie sind für die meisten Fälle schnell genug. Mit Booleans können Sie einfach diese Syntax verwenden, die in Kürze gewinnen wird:

v = !v;
13
Mark Knol

Eine andere Form Ihrer ursprünglichen Lösung:

v = Number(v == 0);

EDIT: Vielen Dank an TehShrike und Guffa für den Hinweis auf den Fehler in meiner ursprünglichen Lösung.

12
Kurt Kaylor

Ich würde es deutlicher machen.

Was bedeutet v?

Zum Beispiel, wenn v irgendein Zustand ist. Erstellen Sie ein Objekt Status. In DDD ein Wertobjekt.

Implementieren Sie die Logik in diesem Wertobjekt. Dann können Sie Ihren Code auf eine funktionellere Weise schreiben, die besser lesbar ist. Der Statuswechsel kann durch Erstellen eines neuen Status basierend auf dem aktuellen Status erfolgen. Ihre if-Anweisung/-Logik wird dann in Ihrem Objekt gekapselt. Ein valueObject ist immer unveränderlich und hat daher keine Identität. Um den Wert zu ändern, müssen Sie einen neuen erstellen.

Beispiel:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);
11
Marco Franssen

Das fehlt:

v = [1, 0][v];

Es funktioniert auch als Round-Robin:

v = [2, 0, 1][v]; // 0 2 1 0 ...
v = [1, 2, 0][v]; // 0 1 2 0 ...
v = [1, 2, 3, 4, 5, 0][v]; // 0 1 2 3 4 5 ...
v = [5, 0, 1, 2, 3, 4][v]; // 0 5 4 3 2 1 0 ...

Oder

v = {0: 1, 1: 0}[v];

Der Charme der letzten Lösung funktioniert auch mit allen anderen Werten.

v = {777: 'seven', 'seven': 777}[v];

Für einen ganz speziellen Fall, wie einen (sich ändernden) Wert und undefined, kann dieses Muster hilfreich sein:

v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...
10
Nina Scholz

Ein anderer Weg, es zu tun:

v = ~(v|-v) >>> 31;
10
Eng.Fouad

Nur für Kicks: v = Math.pow(v-1,v) wechselt auch zwischen 1 und 0.

8
Blazemonger

Noch eine: v=++v%2

(in C wäre es einfach ++v%=2)

ps. Ja, ich weiß, dass es eine doppelte Zuweisung ist, aber dies ist nur eine unvollständige Umschreibung der Methode von C (die nicht so funktioniert wie sie ist, da der JS-Pre-Increment-Operator nicht lvalue zurückgibt.

7
Adam Jurczyk

definieren Sie ein Array {1,0}, setzen Sie v auf v [v]. Daher wird v mit dem Wert 0 zu 1 und vica umgekehrt.

7
S..

Wenn Ihnen garantiert ist, dass Ihre Eingabe entweder eine 1 oder eine 0 ist, können Sie Folgendes verwenden:

v = 2+~v;
7
brandx

Da dies JavaScript ist, können wir den unary + verwenden, um in int zu konvertieren:

v = +!v;

Dies wird logisch NOT der Wert von v (gibt true wenn v == 0 oder false wenn v == 1). Dann konvertieren wir den zurückgegebenen booleschen Wert in seine entsprechende Ganzzahldarstellung.

6
0x499602D2

Eine andere kreative Methode, bei der v einem beliebigen Wert entspricht, gibt immer 0 oder 1 zurück.

v = !!v^1;
5
Yanick Rochon
v=!v;

funktioniert für v = 0 und v = 1; und den Staat umschalten;

4
teacher

Wenn mögliche Werte für v nur 0 und 1 sind, dann wird für jede ganze Zahl x der Ausdruck: V = Math.pow ((Math.pow (x, v) - x), v); .__ der Wert.

Ich weiß, dass dies eine hässliche Lösung ist und das OP nicht danach gesucht hat ... aber ich dachte gerade über eine andere Lösung nach, als ich im Klo war: P

4
Amit

Ungetestet, aber wenn Sie nach einem Boolean suchen, denke ich, var v = !v wird funktionieren.

Referenz: http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables

3
Martin Bean

Wenn es nur zwei Werte gibt, wie in diesem Fall (0, 1), glaube ich, dass die Verwendung von int verschwenderisch ist. Boolean lieber gehen und in Stücke arbeiten. Ich weiß, ich gehe davon aus, aber im Falle eines Wechsels zwischen zwei Zuständen scheint Boolean die ideale Wahl zu sein. 

1
Amber

Nun, da wir wissen, dass in Javascript nur der boolsche Vergleich auch das erwartete Ergebnis liefert.

d.h. v = v == 0 ist dafür ausreichend.

Unten ist der Code dafür:

var v = 0; 
alert("if v  is 0 output: "+ (v == 0) );

setTimeout(function(){
v = 1; 
alert("if v  is 1 Output: "+ (v == 0) );
}, 1000);

JSFiddle: https://jsfiddle.net/vikash2402/83zf2zz0/

Ich hoffe, das hilft dir :)

1
Vikash Pandey

v = Zahl (! ​​v)

Es wird der invertierte boolesche Wert in Number (der gewünschten Ausgabe) umgewandelt.

0
Rohit Goyal