2016-07-04 34 views
7

Sto provando a creare un widget di composizione, rilevare l'evento "keydown" ed evidenziare il numero del dialer corrispondente.JS - Tasto tastiera alfanumerica della mappaCodice del numero del tastierino numerico 2 - 9

Così, per esempio cliccando su "A" sulla tastiera, potrebbe evidenziare "2" sulla UI:

dialer HTML UI

Sono riuscito a mappare le prime 5 cifre (2-6). Dal momento che contengono 3 lettere ciascuna, sono stato in grado di mappare il codice chiave in questo modo:

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

Q: C'è un modo per farlo in una riga, quindi PQRS e WXYZ sarebbero adatti alla soluzione?

+0

perché non creare un oggetto contenente le informazioni di mapping tra i caratteri di stringa e numeri? – dude

+0

Grazie, per la risposta ... Penso che questa sia la soluzione più ovvia, sto cercando una soluzione matematica –

+0

Tranne se stai provando a farlo per divertimento, penso che non sia una buona idea. Penso che non ci sia alcun beneficio ragionevole nell'efficienza semplicemente usando un oggetto di mappatura come '{a: 2, b: 2, c: 2, d: 3, ...}' e anche l'impronta dell'uso della memoria non è troppo grande. Mentre eseguirlo con la matematica non è estendibile nel caso in cui si desideri supportare i layout di altre regioni in un secondo momento. - Ovviamente, non so, nel caso dei pad numerici, se ci sono troppe varianti regionali, ma immagino che almeno dovrebbero esistere varianti cinesi e giapponesi ... – bitifet

risposta

5

Se si ha realmente bisogno, che potrebbe funzionare:

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

ma bisogna anche fare in modo che KeyCode in realtà è una lettera.

La soluzione più ovvia si discusso è il modo migliore, perché è leggibile, configurabile, e peforms altrettanto veloce:

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 So che hai discusso della mappatura inversa ma penso che questa sia "più vicina al problema" e più breve :) – dercz

+0

D'accordo, a volte tendo ad aggirare il problema :) –

3

[Una mappa] è la soluzione più ovvia, sto cercando in un soluzione matematica

Se stai cercando un'espressione analitica, puoi ad esempio una funzione quadratica o esponenziale alla data mappatura dei keycode ai numeri: keycode fit

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

In alternativa, si potrebbe codificare il verificano 'anomalie' a keycode> 82 e keycode> 89 tramite operatore di confronto.

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

Il fit esponenziale ha il vantaggio che il termine codice chiave appare solo una volta, mentre l'espressione più tardi è più leggibile.

implementazione del campione/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

Vale la pena la taglia –

Problemi correlati