[ CodeWar ] - 012:rgb 转 hex

328 阅读1分钟

系列文章

题目

img-01

需求:

  • 将输入的三个数字转化成十六进制的格式

解析

相比于之前的几道题,这道题相对简单很多,思路如下:

  • 判断数字是否处于 0~255 之间,超出则取边界
  • 将数字转为十六进制格式,如果长度小于 2 则补 0
const rgb = (r, g, b) =>
  [r, g, b]
    .map((dec) => Math.max(0Math.min(255, dec)))
    .map((dec) => (dec.toString(16).length < 2 ? `0${dec.toString(16).toUpperCase()}` : dec.toString(16).toUpperCase()))
    .join('')

优化

上述代码虽然看起来比较简洁,但实际上需要遍历两次,那么这里换一个思路,对齐进行优化:

  • 有的数转十六进制需要补 0,有的不需要
  • 那么自然可以将所有数都补 0,然后截取最后两位
  • 这样需要补 0 的数可以截取到 0 和本身
  • 不需要补的则只截取到本身
const rgb = (r, g, b) =>
  [r, g, b]
    .map((dec) => `0${Math.max(0Math.min(255, dec)).toString(16)}`.slice(-2))
    .join('')
    .toUpperCase()