2016-05-26 17 views
0

Ich habe für die Schleife, die das Array mit Argumenten durchläuft. Wenn das nächste Argument "?", "&" oder "||" ist, sollte es kein Komma hinzufügen, es wird jedoch immer hinzugefügt. Ich konnte nicht verstehen, warum, hier ist der Code:Warum funktioniert dieser JavaScript-Code nicht?

var args = ["arg1","arg2","?","arg3"]; 
 
var query = ""; 
 
for (var i = 0; i < args.length; i++) { 
 

 
\t \t switch (args[i]) { 
 

 
\t \t \t case "?": 
 
\t \t \t \t query += " where "; 
 
\t \t \t \t break; 
 

 
\t \t \t case "&": 
 
\t \t \t \t query += " and "; 
 
\t \t \t \t break; 
 

 
\t \t \t case "||": 
 
\t \t \t \t query += " or "; 
 
\t \t \t \t break; 
 

 
\t \t \t default: 
 
\t \t \t \t if (args[i+1] != "?"); 
 
\t \t \t \t { 
 
\t \t \t \t \t query += args[i] + ", "; 
 
\t \t \t \t \t break; 
 
\t \t \t \t } 
 
\t \t \t \t query += args[i] + " "; 
 
\t \t \t \t break; 
 

 
\t \t } 
 

 
\t } 
 
document.write(query);

Wenn ich schreibe dies (dies wird gesplittet durch "" und Array args gesendet):

arg1 arg2 ? arg3 

Es druckt es so:

arg1, arg2, where arg3, // while it should be arg1, arg2 where arg3, 

Dank für das Helfen von Leuten, Problem wurde durch ein externes Skript verursacht. Und ja, I entfernt Semikolon;)

+0

wo ist es anders? Arg1, arg2, wo arg3, // während es arg1 sein sollte, arg2 wo arg3, '? –

+1

@NinaScholz das Komma nach 'arg2' vor' wo' ist anscheinend nicht erwünscht. – Pointy

+1

Drucke wo? Sie "drucken" wahrscheinlich ein Array, und seine 'toString'-Methode fügt das Komma hinzu. – Teemu

Antwort

5

Ihre if Aussage gebrochen:

 if (args[i+1] != "?"); // <---- remove that semicolon 
     { 
      query += args[i] + ", "; 
      break; 
     } 

Sie eine verirrte Semikolon haben. Es ist kein Syntaxfehler, aber es bedeutet, dass if nichts tut. Der Code, der das Komma immer enthält, wird ausgeführt, und das switch wird vor dem Code nicht das Komma hinzufügen beendet.

+0

siehe seine Kommentare. –

+1

@CayceK Ich habe, und ich habe auch den Code ausgeführt. Es funktioniert ohne das Semikolon. – Pointy

+0

Danke für den Versuch, zu helfen, aber ich habe das gelöst. Dieses Problem wurde von einem anderen Array von extern Skript verursacht, jetzt funktioniert alles. Danke für die Antworten trotzdem. – Nikola

1

Sie haben ein Semikolon zwischen wenn und dem Block:

if (args[i+1] != "?"); 

Sollte

if (args[i+1] != "?") 
1

kann es sein, ganz andere Möglichkeiten, dieses Problem zu lösen, die Ihren Code einfacher machen würde, ohne zu verlängern Vertiefung Bäume von if oder switch

Ein kurzes Beispiel,

// define some dictionaries 
let logicDict = Object.assign(Object.create(null), { 
    '?': 'where', 
    '&': 'and', 
    '||': 'or' 
}); 

// define some flags 
let noComma = false; 

// reduce your array 
['arg1', 'arg2', '?', 'arg3'].reduceRight((str, e) => { 
    if (e in logicDict) { 
     noComma = true; 
     return logicDict[e] + ' ' + str; 
    } 
    if (!noComma) e += ','; 
    noComma = false; 
    return e + ' ' + str; 
}, '').slice(0, -1); 
// "arg1, arg2 where arg3," 
+0

Das ist sehr interessant. Vielen Dank! – Nikola

0

Vielen Dank für Semikolon Jungs, Problem wurde von einem externen Skript verursacht.

+1

Ihr Skript, nur modifiziert *, um "query" zu deklarieren und "args" bis zu "process.argv" als Node.js-Programm zu haken, funktionierte nicht mit dem Semikolon, aber * * funktionierte korrekt, sobald das Semikolon war entfernt. – Pointy

+1

In der Tat. Lass das Semikolon ein und es wird immer noch falsch sein. – 1983

+0

LOL, sagte ich ** Danke, dass du Semikolon-Typen bemerkt hast, und du beschwerst dich immer noch über ... Semikolon ?! Ja, das war ein Fehler, ich weiß es! Egal, wie es sich dumm anhört, aber es funktionierte sogar mit diesem Semikolon (und ich bin mir wirklich nicht sicher wie, aber ich ** entfernte es **). Ich werde diese Jungs nicht wiederholen. Bitte, es gibt nichts Neues darüber zu sagen. Danke fürs Wiedererkennen! – Nikola

Verwandte Themen