2010-12-30 16 views
1

http://jsfiddle.net/LU3pE/Warum funktioniert dieser JavaScript-Code nicht?

Ich möchte die Funktion, um die Argumente in eine einzige Zeichenfolge und geben Sie es zurück. Was habe ich falsch gemacht?

function cooncc(divider, lastdiv){ 
    var returner; 
    for (var i = 0; i < (arguments.length - 2); i++) 
    { 
     returner += arguments[i+2] + divider; 
    } 
    returner -= divider; 
    returner += lastdiv + arguments[arguments.length - 1]; 
    return divider; 
} 
var output = cooncc(", ", ", and ", "Andy", "Becky", "Caitlin", "Dave", "Erica", "Fergus", "Gaby"); 
document.body.innerHTML = "<h1>" + output + ".</h1>"; 

Antwort

4

Sie tun viele Dinge falsch. Hier ist eine Aufschlüsselung, was Sie brauchen zu beheben:

  1. Sie Rückkehr divider! Ändern Sie diesen zu returner:

    return returner; 
    
  2. Diese Linie nicht tut, was Sie erwarten:

    returner -= divider 
    

    Sie können keine Strings von Saiten abziehen, wenn sie Zahlen sind, und das ist, warum Sie NaN bekommen (nicht- a-Nummer) in der Ausgabe.

    Versuchen:

    returner = returner.substring(0,returner.lastIndexOf(divider)); 
    
  3. Sie wurde nicht initialisiert returner. Das wird dir ein "undefined" in deine Zeichenfolge bringen. Initialisieren auf die leere Zeichenfolge:

    var returner = ""; 
    
  4. Du fügst die letzte Saite zweimal: einmal in der Schleife und dann ein letztes Mal mit dem letzten Teiler. stoppen Sie einfach die Schleife ein früher:

    for (var i = 0; i < (arguments.length - 3); i++) 
    
  5. Schließlich darüber nachdenken, was passiert, wenn man es so mit nur einer Saite rufen verketten: cooncc(", ", ", and ", "Andy"). Sie können diese Klausel mit einer Wache lösen:

    if(arguments.length == 3) return arguments[2]; 
    
0

Nehmen Sie die Argumente in einer einzigen Saite? Meinst du, du willst diese Ausgabe?

, , and AndyBeckyCaitlinDaveEricaFergusGaby 

Wenn ja, können Sie diese Änderung des Codes verwenden:

function cooncc(divider, lastdiv){ 
    var returner = ""; 

    console.log(arguments.length); 

    for (var i = 0; i < arguments.length; i++) { 
     returner += arguments[i]; 
    } 

    return returner; 
} 
var output = cooncc(", ", ", and ", "Andy", "Becky", "Caitlin", "Dave", "Erica", "Fergus", "Gaby"); 
document.body.innerHTML = "<h1>" + output + ".</h1>"; 

Ach ja, und wenn Sie das letzte Bit in Ihrem Code return divider-return returner ändern, erhalten Sie

NaN, and Gaby 

obwohl ich nicht sicher bin, ob das was du willst.

0

ausweicht die Frage, aber es gibt elegantere Möglichkeiten, zu tun, was Sie tun möchten:

var names = ["Andy", "Becky", "Caitlin", "Dave", "Erica", "Fergus", "Gaby"]; 
var divider = ', '; 
var lastDivider = ' and '; 

var concatNames = names.slice(0, -1).join(divider) + 
        lastDivider + 
        names[names.length - 1]; 

alert(concatNames); 

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/join
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

0

initialisieren returner?

var returner = ""; 

Und Sie können mit Streichern nicht tun:

returner -= divider 
0

Sie brauchen returner zu initialisieren und sie können nicht - = mit Teiler. Wenn du nach dem Zurückkehrer - = Teiler Alarm gibst (Rückkehrer) bekommst du NaN zurück. versuchen Sie es mit diesem Fix.

function cooncc(divider, lastdiv){ 
    var returner = ""; 
    for (var i = 0; i < (arguments.length - 3); i++) 
    { 
     returner += arguments[i+2] + divider; 
    } 
    returner = returner.substring(0,returner.lastIndexOf(divider)); 
    returner += lastdiv + arguments[arguments.length - 1]; 
    return returner; 
} 
var output = cooncc(", ", ", and ", "Andy", "Becky", "Caitlin", "Dave", "Erica", "Fergus", "Gaby"); 
document.body.innerHTML = "<h1>" + output + ".</h1>"; 
0

Ihre Funktion benötigt komplett neu geschrieben, hier ist Version arbeiten:

function cooncc(){ 
    var arrWords = new Array(); 
    var divider = arguments[0]; 
    var lastdiv = arguments[1]; 
    for (var i = 2; i < arguments.length; i++) 
    { 
     var curWord = arguments[i]; 
     if (i == arguments.length - 1 && i > 2) { 
      arrWords[arrWords.length - 1] += lastdiv + curWord; 
     } 
     else { 
      arrWords.push(curWord); 
     } 
    } 
    return arrWords.join(arguments[0]); 
} 

(keine Änderung in Aufruf)

Aktualisiert jsFiddle: http://jsfiddle.net/yahavbr/LU3pE/1/

Verwandte Themen