2016-10-09 4 views
6

मैंने सोचा कि यह एक आसान काम था लेकिन यह वास्तव में जटिल हो रहा है। कोड देखें।सबस्ट्रिंग, स्प्लिट, स्ट्रिंग टू नंबर और आरजीबी से हेक्स

// Convert "rgb(255, 255, 255)" to (255, 255, 255) and then to Hex code 
    var data = { 
     color:"rgb(165,199,72)", 
     color:"rgb(229,121,74)", 
     color:"rgb(105,177,222)"   
    } 
    // rgb To Hex Conversion 
    var componentToHex = function(c) {    
     var hex = c.toString(16); 
     return hex.length == 1 ? "0" + hex : hex; 
    }  
    var rgbHex = function(r, g, b) { 
     return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); 
    } 


    //Substring "rgb(255, 255, 255)" to "(255, 255, 255)" 
    var subStringRGB = function(c){ 
     var b = c.substring(4, c.length); 
    } 
    var stringRGBtoNumber = function(c){ 
     var b = Number(c.split(',')); 
    } 

यह त्रुटि फेंक रहा है, अपरिभाषित के विभाजन को पढ़ नहीं सकता है। इसे कैसे ठीक करें?

+0

आप शाब्दिक आपत्ति यह है, पिछले की सामग्री के साथ पहले दो गुण अधिलेखित कर देता है सबसे अच्छा मामले में, मान्य नहीं है। –

उत्तर

1

आप कार्यों प्रसार ऑपरेटर के साथ एक झुलसाना लाइन और मूल्यों के कुछ हिस्सों के कुछ मानचित्रण करने के लिए जोड़ सकता।

subStringRGB और stringRGBtoNumber अब संसाधित मूल्य लौटाता है।

var data = [{ color:"rgb(165,199,72)"}, { color:"rgb(229,121,74)" },{ color:"rgb(105,177,222)" }],   
 
    componentToHex = function(c) {    
 
     var hex = c.toString(16); 
 
     return hex.length == 1 ? "0" + hex : hex; 
 
    }, 
 
    rgbHex = function(r, g, b) { 
 
     return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); 
 
    }, 
 
    subStringRGB = function(c){ 
 
     return c.slice(4, -1); 
 
    }, 
 
    stringRGBtoNumber = function(c){ 
 
     return c.split(',').map(Number); // split and convert all parts to Number 
 
    }; 
 
    
 
console.log(data.map(c => rgbHex(...stringRGBtoNumber(subStringRGB(c.color)).map(componentToHex))));

2

subStringRGB कोई मूल्य नहीं लौटाता है। इसलिए, यदि आप subStringRGB से stringRGBtoNumberc का परिणाम undefinedstringRGBtoNumber में परिणाम पास करेंगे। वैसे, stringRGBtoNumber भी एक मान वापस नहीं करता है।

1

नियमित अभिव्यक्ति के साथ इसे संसाधित करना आसान है।

var arr = /rgb(\((\d+),(\d+),(\d+)\))/.exec("rgb(255,255,255)"); 
 
console.log(arr[1]); // it shows (255,255,255) 
 
var hexVal = (parseInt(arr[2]) << 16) + (parseInt(arr[3]) << 8) + parseInt(arr[4]); // calculate the decimal value 
 
console.log("0x" + hexVal.toString(16)); // it shows 0xffffff

+0

मैं दो बदलाव करता हूं: 'var hexVal = arr [2] << 16 | एआर [3] << 8 | एआर [4]; 'आईएमओ यह आसान है और' console.log ("#" + (0x1000000 | हेक्सवेल) .toString (16) .substr (1)); हेक्स-नोटेशन में उचित रंग मुद्रित करने के लिए (और अग्रणी शून्य यहां महत्वपूर्ण हैं) – Thomas

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