2016-07-04 13 views
7

मैप अल्फान्यूमेरिक कीबोर्ड कुंजी कोड डायलर विजेट बनाने की कोशिश कर रहा हूं, "कीडाउन" ईवेंट पकड़ें और इसी डायलर नंबर को हाइलाइट करें।जेएस - डायल पैड नंबर 2 - 9

तो, उदाहरण के क्लिक करने 'ए' कुंजीपटल पर के लिए, "2" पर प्रकाश डाला जाएगा यूआई पर:

dialer HTML UI

मैं पहली बार 5 अंक (2-6) मैप करने के लिए प्रबंधित किया है। चूंकि उनमें प्रत्येक 3 अक्षर होते हैं, इसलिए मैं कुंजीकोड को मैप करने में सक्षम था:

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

प्रश्न: क्या यह एक पंक्ति में ऐसा करने का कोई तरीका है, इसलिए पीक्यूआरएस और डब्ल्यूएक्सवाईजेड समाधान में फिट होगा?

+0

क्यों एक वस्तु स्ट्रिंग वर्णों और संख्याओं के बीच मानचित्रण जानकारी युक्त नहीं बना? – dude

+0

धन्यवाद, उत्तर के लिए ... मुझे लगता है कि यह स्पष्ट समाधान है, मैं गणित समाधान में देख रहा हूं –

+0

अगर आप इसे मज़ेदार करने की कोशिश कर रहे हैं, तो मुझे लगता है कि यह एक बहुत अच्छा विचार नहीं है। मुझे लगता है कि मैपिंग ऑब्जेक्ट जैसे '{a: 2, b: 2, c: 2, d: 3, ...}' का उपयोग करने से कोई समझदार दक्षता लाभ नहीं है और स्मृति उपयोग पदचिह्न भी बहुत बड़ा नहीं है। गणित द्वारा इसे करने के दौरान यदि आप बाद में अन्य क्षेत्रों के लेआउट का समर्थन करना चाहते हैं तो यह विस्तार योग्य नहीं है। - बेशक, मुझे नहीं पता, संख्यात्मक पैड के मामले में, यदि बहुत से क्षेत्रीय भिन्नताएं हैं, लेकिन मुझे लगता है कि कम से कम चीनी और जापानी रूपों का अस्तित्व होना चाहिए ... – bitifet

उत्तर

5

तुम सच में की जरूरत है, कि काम हो सकता है:

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

लेकिन आप यह भी सुनिश्चित करें कि कीकोड वास्तव में एक पत्र है बनाने के लिए किया है। क्योंकि यह, पठनीय विन्यास है

स्पष्ट समाधान आप पर चर्चा की, जिस तरह से बेहतर है, और समान रूप से तेजी से peforms:

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

पीएस मुझे पता है कि आपने रिवर्स मैपिंग पर चर्चा की लेकिन मुझे लगता है कि यह "समस्या के करीब" है, और छोटा :) – dercz

+0

सहमत है, कभी-कभी मैं समस्या के चारों ओर घूमता हूं :) –

3

[एक नक्शा] है स्पष्ट समाधान, मैं एक में देख रहा हूँ गणित समाधान

यदि आप एक विश्लेषणात्मक अभिव्यक्ति की तलाश में हैं, तो आप फिट कर सकते हैं नंबरों के लिए keycodes के दिए गए मानचित्रण के लिए एक द्विघात या घातीय समारोह: keycode fit

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

वैकल्पिक रूप से, आप तुलना ऑपरेटर के माध्यम से कीकोड> 82 और कीकोड> 89 में 'विसंगतियों' घटित सांकेतिक शब्दों में बदलना कर सकते हैं।

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

घातीय फिट का लाभ यह है कि कुंजीकोड शब्द केवल एक बार प्रकट होता है, जबकि बाद की अभिव्यक्ति अधिक पठनीय होती है।

नमूना कार्यान्वयन/परीक्षण:

// 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

बकाया राशि के लायक –

संबंधित मुद्दे