2016-04-29 6 views
0

Nur zum Spaß, schrieb ich ein schnelles Skript, um eine Zeichenfolge mit durch Komma getrennten Zeichen, verwende ich die Kommas, um ein anderes Wort, und ich ein Array mit den Worten als Elemente ausgeben . Mein Problem ist mit meiner Logik - das funktioniert nur für Kommas in der ursprünglichen Zeichenfolge.JS konvertieren Begrenzer getrennte Zeichenfolge zu Array-Elementen

Was passiert, ist, dass der Algorithmus nur das erste Element (ein Komma) im Delimiter-Array betrachtet, das ich beim Aufruf meiner Funktion zur Verfügung stelle. Ich denke darüber nach, einen Boolean als Flagge zu benutzen, aber ich bin mir nicht sicher, ob das wirklich der beste Weg ist. Irgendein Rat?

var stringToArray = function(delimiterArray, originalString) { 
 
    var arrayOutput = [] 
 
    var tempWord = "" 
 
    for (var i = 0; i < originalString.length; i++) { 
 

 
    for (var j = 0; j < delimiterArray.length; j++) { 
 

 
     var currentCharacter = originalString.charAt(i) 
 
     var currentDelimiter = delimiterArray[j] 
 

 
     while (currentCharacter != currentDelimiter) { 
 
     tempWord += currentCharacter 
 
      //once we hit a delimiter, break so that we can move onto the next conditional statement. 
 
     break 
 
     } 
 

 
     if (currentCharacter === currentDelimiter) { 
 
     //push word onto the array to hold each string, and then break out so we can go back to the iteration of the nested loops 
 
     arrayOutput.push(tempWord) 
 
     tempWord = "" 
 
     break 
 
     } 
 

 
     //we break out of the second for loop -> 
 
     break 
 
    } 
 

 
    } 
 
    return arrayOutput 
 
} 
 

 
delims = [',', '.', ';', ' '] 
 
originalString = "USA,Canada,Mexico,Bermuda,Grenada,Belize" 
 

 
finalOutput = stringToArray(delims, originalString) 
 
console.log(finalOutput)

Wenn ich einen '' Als Trennzeichen in der Zeichenfolge, die ich als Argument verwende, schlägt mein Algorithmus fehl. Ich habe dies in C mit booleschen Flags (vor langer Zeit) implementiert, wo ich viel mehr Code schreiben musste, weil ich keine eingebauten Funktionen benutzte (musste die Länge von allem finden, um genügend Speicher für Datenstrukturen zu haben) Sachen lagern). Ich möchte diesen alten Code jedoch nicht noch einmal aufgreifen.

+0

Javascript hat bereits ein 'split()' Funktion, dies zu tun. Wenn Sie ein Array nach etwas suchen möchten, können Sie 'indexOf()' verwenden, anstatt eine eigene Schleife zu schreiben. – Barmar

+0

@Barmar Ja, voll bewusst. Wie in der ersten Zeile gesagt, war dies nur zum Spaß. Ich möchte es selbst implementieren. –

+0

Ihre 'while()' - Schleife ändert nie 'currentCharacter' oder' currentDelimiter', so dass es für immer eine Schleife bildet. – Barmar

Antwort

0

Das Problem ist, dass Sie das aktuelle Zeichen zu tempWord hinzufügen, wenn es nicht mit dem aktuellen Trennzeichen übereinstimmt. Wenn also das aktuelle Zeichen nicht mit dem ersten Trennzeichen übereinstimmt, wird es zu tempWord hinzugefügt, auch wenn es mit einem der anderen Trennzeichen übereinstimmt. Sie müssen das gesamte Begrenzerarray durchlaufen, bevor Sie feststellen können, ob das Zeichen ein Begrenzer ist oder nicht.

var stringToArray = function(delimiterArray, originalString) { 
 
    var arrayOutput = []; 
 
    var tempWord = ""; 
 
    for (var i = 0; i < originalString.length; i++) { 
 
    var currentCharacter = originalString.charAt(i) 
 
    var isDelimiter = false; 
 
    for (var j = 0; j < delimiterArray.length; j++) { 
 

 
     var currentDelimiter = delimiterArray[j] 
 

 
     if (currentCharacter == currentDelimiter) { 
 
     isDelimiter = true; 
 
     //once we hit a delimiter, break so that we can move onto the next conditional statement. 
 
     break; 
 
     } 
 

 
    } 
 
    if (isDelimiter) { 
 
     arrayOutput.push(tempWord); 
 
     tempWord = ""; 
 
    } else { 
 
     tempWord += currentCharacter; 
 
    } 
 

 
    } 
 
    return arrayOutput; 
 
} 
 

 
delims = [',', '.', ';', ' '] 
 
originalString = "USA,Canada.Mexico,Bermuda,Grenada,Belize" 
 

 
finalOutput = stringToArray(delims, originalString) 
 
console.log(finalOutput)

Aus irgendeinem Grund scheint dies ein unglaublich häufiger Fehler von Menschen zu sein, ihre eigenen Array schreiben Suche Code.

+0

Macht jetzt vollkommen Sinn, haha. Danke für die Hilfe! –

0

Sie hatten ein paar Probleme:

  • Sie eine Pause in einer while-Schleife verwendet. Das hat nichts bewirkt, es bricht aus der While-Schleife aus, nicht aus der oberen Schleife.
  • Die Unterbrechung am Ende der for-Schleife hat nichts bewirkt, sie bricht aus der for-Schleife aus.
  • Ihnen fehlte das letzte Wort, Sie müssen dies auf das Array am Ende drücken.
  • Ich habe den Deliminator Check auf die isDeliminator() Funktion herausgebrochen. Dies macht den Code übersichtlicher, modularer (Sie könnten ihn wieder verwenden) und reduziert in der Regel die Fehler.

Unten ist mein Code.

function stringToArray(delimiterArray, originalString) { 
 
     var arrayOutput = []; 
 
     var tempWord = ''; 
 
     for (var i = 0; i < originalString.length; i++) { 
 

 
      var currentCharacter = originalString.charAt(i); 
 

 
      if (isDeliminator(currentCharacter)) { 
 
       //push word onto the array to hold each string, and then break out so we can go back to the iteration of the nested loops 
 
       arrayOutput.push(tempWord); 
 
       tempWord = ''; 
 
      } else { 
 
       tempWord += currentCharacter; 
 
      } 
 

 
     } 
 

 
     // Push the last work onto the array 
 
     arrayOutput.push(tempWord); 
 

 
     return arrayOutput; 
 
} 
 

 
function isDeliminator(char) { 
 
    for (var i = 0; i < delims.length; i += 1) { 
 
     if (char === delims[i]) { 
 
      return true; 
 
     } 
 
    } 
 
    return false; 
 
} 
 

 
var delims = [',', '.', ';', ' ']; 
 
var inputString = 'USA.Canada,Mexico;Bermuda,Grenada,Belize'; 
 
var finalOutput = stringToArray(delims, inputString); 
 
console.log(finalOutput);

0

Hier ist eine korrigierte Skript, mit den Änderungen kommentiert:

var stringToArray = function(delimiterArray, originalString) { 
 
    var arrayOutput = [] 
 
    var tempWord = "" 
 
    for (var i = 0; i < originalString.length; i++) { 
 
    // Set currentCharacter here, as it does not depend on j: 
 
    var currentCharacter = originalString.charAt(i) 
 

 
    for (var j = 0; j < delimiterArray.length; j++) { 
 

 
     var currentDelimiter = delimiterArray[j] 
 

 
     if (currentCharacter === currentDelimiter) { 
 
     //push word onto the array to hold each string, and then break out so we can go back to the iteration of the nested loops 
 
     arrayOutput.push(tempWord) 
 
     tempWord = "" 
 
     break 
 
     } 
 

 
     //No, we don't break out of the second for loop -> 
 
    } 
 

 
    // Moved out of the j-loop, and turned into an IF without BREAK: 
 
    if (currentCharacter != currentDelimiter) { 
 
     tempWord += currentCharacter 
 
    } 
 

 
    } 
 
    return arrayOutput 
 
} 
 

 
var delims = [',', '.', ';', ' '] 
 
var originalString = "USA,Canada,Mexico,Bermuda,Grenada,Belize" 
 

 
var finalOutput = stringToArray(delims, originalString) 
 
document.write(JSON.stringify(finalOutput))

Verwandte Themen