Skip to content

Latest commit

 

History

History
53 lines (45 loc) · 1.62 KB

#21-16进制颜色值转RGB.md

File metadata and controls

53 lines (45 loc) · 1.62 KB

题目描述:

完成函数 hexToRGB,它的作用将 16 进制颜色值转换成 RGB 值:

hexToRGB('#F0F0F0') // => rgb(240, 240, 240)
hexToRGB('#9fc') // => rgb(153, 255, 204)
hexToRGB('无效颜色') // => null

思路:

16进制转十进制如何计算。A,B,C,D,E,F,不区分大小写这六个字母分别表示10,11,12,13,14,15 首先判断是否是16进制的颜色,特点以#号开头,其余是字母和数字,6位或者3位。 正则匹配如何只匹配3位数字或字母,或只匹配6位数字或字母


参考答案:

const hexToRGB = (hex) => {
  if(!/^\#([a-fA-F0-9]{3})$/g.test(hex) && !/^\#([a-fA-F0-9]{6})$/g.test(hex)) return null
  
  let len = hex.slice(1).length;
  let str = len === 6 ? hex.slice(1) : hex.slice(1)[0].repeat(2) + hex.slice(1)[1].repeat(2) + hex.slice(1)[2].repeat(2);
  let arr_str = str.split('');
  let new_arr_str = arr_str.map((item, index) => {
    if(item === 'a' || item === 'A') {
      return 10
    } else if(item === 'b' || item === 'B') {
      return 11
    } else if(item === 'c' || item === 'C') {
      return 12
    } else if(item === 'd' || item === 'D') {
      return 13
    } else if(item === 'e' || item === 'E') {
      return 14
    } else if(item === 'f' || item === 'F') {
      return 15
    } else {
      return Number(item);
    }
  })
  let num1 =  new_arr_str[0] * 16 + new_arr_str[1];
  let num2 = new_arr_str[2] * 16 + new_arr_str[3];
  let num3 = new_arr_str[4] * 16 + new_arr_str[5];
  return `rgb(${num1}, ${num2}, ${num3})`
}