Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将rgb数字数组转换为十六进制颜色字符串_Javascript_Arrays_Hex_Rgb_Converters - Fatal编程技术网

Javascript 将rgb数字数组转换为十六进制颜色字符串

Javascript 将rgb数字数组转换为十六进制颜色字符串,javascript,arrays,hex,rgb,converters,Javascript,Arrays,Hex,Rgb,Converters,我已经编写了一个工作方法,可以将rgb值数组转换为十六进制颜色字符串: /** *@param{Number[]}arr数组有三个条目(rgb:[0-255,0-255,0-255])。 *@return{String}十六进制颜色作为字符串(rgb:'#000000'-'#ffffff')。 */ 函数arrToHex(arr){ 返回“#”+arr .map(v=>('0'+v.toString(16)).slice(-2)) .加入(“”); } 但就效率而言,我不确定这种方法是否是最好

我已经编写了一个工作方法,可以将rgb值数组转换为十六进制颜色字符串:

/**
*@param{Number[]}arr数组有三个条目(rgb:[0-255,0-255,0-255])。
*@return{String}十六进制颜色作为字符串(rgb:'#000000'-'#ffffff')。
*/
函数arrToHex(arr){
返回“#”+arr
.map(v=>('0'+v.toString(16)).slice(-2))
.加入(“”);
}
但就效率而言,我不确定这种方法是否是最好的方法。这个方法在我的代码中经常被调用

尤其是带有
('0'+v.toString(16)).slice(-2)
(获取双十六进制)的部分对我来说太复杂了。这能做得更好吗?这是最好的方法吗


业绩评价: 结果显示了使用Google Chrome v83(64位,Linux)运行if计算的平均秒数。 从优到劣

迭代和查找表解决方案,方法为:(~1.1秒)
const hextable=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
函数arrToHex(arr){
让s='#';
for(设i=0;i控制台.timeEnd('arrToHex')您可以尝试对该代码进行基准测试:

const hextable = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];

function arrToHex(arr) {
    let s = '#';
    for (let i = 0; i < arr.length; i++) {
        s += hextable[(arr[i] / 16) | 0];
        s += hextable[arr[i] % 16 | 0];
    }
    return s;
}
const hextable=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
函数arrToHex(arr){
让s='#';
for(设i=0;i
或者如注释中所述,为了避免表查找并依靠运行时进行映射,请执行以下操作:

function arrToHex(arr) {
    let s = '#';
    for (let i = 0; i < arr.length; i++) {
        s += ((arr[i] / 16) | 0).toString(16);
        s += ((arr[i] % 16) | 0).toString(16);
    }
    return s;
}
函数arrToHex(arr){
让s='#';
for(设i=0;i
.toString(16).padStart(2,'0')
是另一种确保您有2个十六进制数字的方法,除此之外,您的代码看起来非常可行,因为浏览器可以自己进行转换,因为以下每种颜色在css中都是有效的:
#rgb
#rrggbb
#rrggbbaa
rgb(r,g,b)
rgba(r,g,b,a)
,转换将由本机代码而不是javascript完成,有任何真正的理由进行转换吗?如果不知道更多,我不会将整个方法简化为大致相同的:
reurn('rgb('+r+','+g+','+b+'))
@enhzflep我已经知道CSS中的
rgb
函数,但这对我的用例没有帮助。整洁,但是
Math.floor
函数可以简化:
Math.floor(arr[I]/16)
arr[I]/16
Math.floor(arr[I]%16)
arr[I]% 16 < /代码>这是一个很好的想法。我已经使它<代码> ARR [i] % 16×0 < /代码>,因此它也可以合理地支持十进制数。它不处理负的或超出范围的值。这是OP(你)要考虑的一个练习。为什么不<代码> HexTabess = […'012345 67 89ABCDEF ] < < /代码>和<代码>可编程[ 0×ARR[i]/16 ] < /代码>?(顺便说一句,第二个可能会稍微提高性能)JS文档定义了允许提供给函数的内容,其他一切都不会影响我。|@selbie@YevgenGorbunkov我将进行性能分析并编辑我的答案以提供结果。给我一点时间。。。