2016-08-30 3 views
3

Ich versuche, eine einfache "Chiffre" zu bauen, um die Buchstaben in einer Zeichenfolge den Wert eines umgekehrten Alphabets (zB a = zb = y, etc ..) Ich baute ein für eine Anweisung, die bis zum letzten Aufruf zu funktionieren scheint und statt des umgekehrten Werts stattdessen den ursprünglichen Wert angibt.Für Anweisung gibt unerwarteten Wert bei der letzten Zuweisung

Ich habe jede Zeile in der for-Anweisung auskommentiert und dann einzeln durchgearbeitet, um ihre Rückgabe zu überprüfen. Die vorletzte Aussage (c = rev.indexOf (c);) gebe den Wert von 25, 24, 23 (wie erwartet), so verstehe ich nicht, warum, wenn sie in der "Buchstaben" -Matrix nachschlagen, a Rückgabe von a, b, c anstelle von z, y, x.

var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'y', 'x', 'z']; 
var rev = letters.reverse(); 

var stringy = function(n){ 
    ns = n.split(""); 
    for (i = 0; i < n.length; i++){ 
      c = ns[i]; 
      c = rev.indexOf(c); 
      c = letters[c]; 
      console.log(c); 
    } 
} 

stringy("abc"); 
+2

@chchrist angemessen gedacht Was tut Hat das mit Schließungen zu tun, oder mit Schleifen? –

Antwort

4

letters.reverse() gibt nicht einfach das umgekehrte Array zurück. Es kehrt das Array an Ort und Stelle um.

Wenn Sie den Inhalt von letters nach letters.reverse() überprüfen, werden Sie sehen, dass die Bestellung storniert wurde.

Sie .slice() verwenden können, um eine Kopie des Arrays zu machen, die Sie dann umkehren:

var rev = letters.slice().reverse(); 
+0

Perfekt, danke! Ich wusste nicht, dass .reverse sich so verhielt. – oneWorkingHeadphone

+0

@oneWorkingHeadphone, "Sortierung" funktioniert auch, ich mag das Verhalten nicht. – zzzzBov

1

Als Ergänzung zu zzzzBov Informationen an die Array.reverse() Methode, dachte ich, ich hätte gerne eine Antwort hinzufügen, die ‚doesn t müssen Sie Ihre Briefe umkehren. Es ist nicht notwendig, 2 Variablen zu behalten, nur um sie basierend auf dem Index umzukehren. Suchen Sie einfach den Index im letters Array und suchen Sie vom Ende des letters Arrays zurück.

habe ich eine leicht modifizierte Version des Codes, um zu zeigen, wie Sie es sich ein bisschen einfacher und fügte einige Code-Kommentaren machen könnte, wo ich

// make your debugging easier 
 
'use strict'; 
 

 
var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'y', 'x', 'z']; 
 

 
var getReversedCypher = function(text, sequence, unmatched) { 
 
    if (!text) { 
 
    return ''; 
 
    } 
 
    var ns = text.split(''), 
 
     cypher = [], 
 
     lastLetterIndex = sequence.length - 1; 
 
    
 
    // use strict adds forEach on arrays 
 
    ns.forEach(function(char) { 
 
    var index = sequence.indexOf(char); 
 
    if (index < 0) { 
 
     // couldn't find a match, you could throw an error, I chose to add an extra character 
 
     cypher.push(unmatched || '-'); 
 
    } else { 
 
     // no need to use a reversed lookup, just search the table from the end 
 
     cypher.push(sequence[lastLetterIndex-index]); 
 
    } 
 
    }); 
 
    return cypher.join(''); 
 
}; 
 

 
// make some utility methods to still use your simple function 
 
var encode = function(text) { 
 
    return getReversedCypher(text, letters, '-'); 
 
}; 
 

 
var decode = function(text) { 
 
    return getReversedCypher(text, [].concat(letters).reverse(), ' '); 
 
}; 
 
    
 
var encoded = encode("this is the sound of speech"), decoded = decode(encoded); 
 

 
console.log('cypher: ' + encoded); 
 
console.log('decoded: ' + decoded);

+0

Es ist, als ob du meine Gedanken gelesen hättest :) Das ist, woran ich als nächstes arbeitete. Vielen Dank für diese Antwort, ich kann viel von der Arbeit lernen. – oneWorkingHeadphone

Verwandte Themen