2016-07-04 15 views
7

Ich versuche, ein Dialer-Widget zu erstellen, fangen "Keydown" -Ereignis und markieren Sie die entsprechende Wählnummer.JS - Map alphanumerische Tastatur keyCode auf eine Wähltastatur Nummer 2 - 9

So zum Beispiel "A" auf der Tastatur drücken, würde Option "2" auf der Benutzeroberfläche:

dialer HTML UI

Ich habe die ersten 5 Ziffern zur Karte verwaltet (2-6). Da sie jeweils 3 Buchstaben enthalten, konnte ich den keyCode wie folgt abbilden:

Math.floor (((KeyCode - 65)/3) + 2).

Q: Gibt es eine Möglichkeit, dies in einer Linie zu tun, so dass PQRS und WXYZ die Lösung passen würden?

+0

Warum nicht ein Objekt erstellen, die Abbildungsinformationen zwischen Zeichenfolge Zeichen und Zahlen enthalten? – dude

+0

Danke, für die Antwort ... Ich denke, das ist die offensichtliche Lösung, ich bin in einer mathematischen Lösung suchen –

+0

Außer wenn Sie versuchen, es aus Spaß zu tun, denke ich, es ist keine sehr gute Idee. Ich denke, es gibt keinen vernünftigen Effizienzvorteil, wenn man einfach ein Mapping-Objekt wie '{a: 2, b: 2, c: 2, d: 3, ...}' 'verwendet und die Speicherauslastung nicht zu groß ist. Dies ist zwar nicht möglich, wenn Sie später andere Regionenlayouts unterstützen möchten. - Natürlich, ich weiß nicht, im Falle von numerischen Pads, wenn es zu viele regionale Variationen gibt, aber ich stelle mir vor, dass zumindest chinesische und japanische Varianten existieren sollten ... – bitifet

Antwort

5

Wenn Sie es wirklich brauchen, das funktionieren könnte:

Math.min(9, Math.floor(((KeyCode - (KeyCode < 83 ? 65 : 66))/3) + 2)) 

, aber Sie müssen auch sicherstellen, dass KeyCode tatsächlich ein Brief.

Die offensichtliche Lösung Sie viel besser diskutiert, weil es lesbar, konfigurierbar ist, und peforms gleich schnell:

function toDialNumber(KeyCode) { 
     var keyMap = {1:"", 2:"ABC", 3:"DEF", 4:"GHI", 5:"JKL", 6:"MNO", 7:"PQRS", 8:"TUV", 9:"WXYZ"}; 
     var letter = String.fromCharCode(KeyCode); 
     for(key in keyMap) if(keyMap[key].indexOf(letter)>=0) return key; 
     return false; 
    } 
+0

PS Ich weiß, dass Sie die umgekehrte Zuordnung diskutiert, aber ich denke, das ist "näher an das Problem", und kürzer :) – dercz

+0

Vereinbarte, manchmal neige ich dazu, um und um das Problem zu gehen :) –

3

[A Karte] die offensichtliche Lösung ist, ich bin in eine Suche math solution

Wenn Sie nach einem analytischen Ausdruck suchen, können Sie z eine quadratische oder Exponentialfunktion der gegebenen Abbildung von keycodes Zahlen: keycode fit

// Exponential fit: 
Math.floor(33.2 - 65.5 * Math.exp(-0.0115 * KeyCode)); 

Alternativ können Sie die ‚Anomalien‘ bei auftretenden keycode> 82 und keycode> 89 über Vergleichsoperator kodieren.

// Comparison: 
Math.floor((KeyCode - 65 - (KeyCode > 82) - (KeyCode > 89))/3 + 2); 

Die exponentielle Anpassung hat den Vorteil, dass der Schlüsselcode nur einmal erscheint, während der spätere Ausdruck besser lesbar ist.

Beispielimplementierung/test:

// Quadratic fit: 
 
var sqr = (k) => -0.0018 * k * k + 0.59 * k - 28.6 | 0; 
 

 
// Exponential fit: 
 
var exp = (k) => 33.2 - 65.5 * Math.exp(-0.0115 * k) | 0; 
 

 
// Comparison: 
 
var cmp = (k) => (k - 65 - (k > 82) - (k > 89))/3 + 2 | 0; 
 

 
for (var k = 65; k <= 90; ++k) { 
 
    console.log(String.fromCharCode(k), sqr(k), exp(k), cmp(k)); 
 
}

+0

lohnt sich das Kopfgeld –