Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 给定一个随机十六进制颜色列表,根据“排序”;“相似性”;_Javascript_Sorting_Colors_Grouping_Approximation - Fatal编程技术网

Javascript 给定一个随机十六进制颜色列表,根据“排序”;“相似性”;

Javascript 给定一个随机十六进制颜色列表,根据“排序”;“相似性”;,javascript,sorting,colors,grouping,approximation,Javascript,Sorting,Colors,Grouping,Approximation,例如,此十六进制值列表: { "colors" : [{"hex" : "#fe4670"}, {"hex" : "#5641bc"}, {"hex" : "#d53fc3"}, {"hex" : "#6b5e09"}, {"hex" : "#4dd685"}, {"hex" : "#88d63f"}, {"hex" : "#

例如,此十六进制值列表:

{
"colors" : [{"hex"   : "#fe4670"},
            {"hex"   : "#5641bc"},
            {"hex"   : "#d53fc3"},
            {"hex"   : "#6b5e09"},
            {"hex"   : "#4dd685"},
            {"hex"   : "#88d63f"},
            {"hex"   : "#eb93f3"},
            {"hex"   : "#f44847"},
            {"hex"   : "#32d159"},
            {"hex"   : "#6e9bde"},
            {"hex"   : "#c3ec64"},
            {"hex"   : "#81cce5"},
            {"hex"   : "#7233b6"},
            {"hex"   : "#bb90c3"},
            {"hex"   : "#728fde"},
            {"hex"   : "#7ef46a"},
            {"hex"   : "#f7cfff"},
            {"hex"   : "#c8b708"},
            {"hex"   : "#b45a35"},
            {"hex"   : "#589279"},
            {"hex"   : "#51f1e1"},
            {"hex"   : "#b1d770"},
            {"hex"   : "#db463d"},
            {"hex"   : "#5b02a2"},
            {"hex"   : "#909440"},
            {"hex"   : "#6f53fe"},
            {"hex"   : "#4c29bd"},
            {"hex"   : "#3b24f8"},
            {"hex"   : "#465271"},
            {"hex"   : "#6243"},
            {"hex"   : "#dbcc4"},
            {"hex"   : "#187c6"},            
            {"hex"   : "#1085e2"},
            {"hex"   : "#b521e9"},
            {"hex"   : "#4bd36d"},             
            {"hex"   : "#11bc34"},
            {"hex"   : "#455c47"},
            {"hex"   : "#a71bbf"},
            {"hex"   : "#988fc2"},
            {"hex"   : "#226cfe"}]
}
理想情况下,它应该分为“绿色”、“蓝色”、“紫色”等

我还没有想出一个很好的方法来把他们分组。将颜色转换为HSV,然后按色调排序,然后是Sat和Val,效果几乎不错,但也有一些例外:

我读过的另一种方法是将它们转换为实验室颜色空间,然后计算三角形。我在这方面取得了多种成功:


(这是根据一种颜色对整个列表进行排序)。我想根据每种颜色对每种颜色的距离进行排序。

下面的示例选择第一种颜色作为比较颜色。它首先将该颜色添加到一个新数组中,然后遍历其余颜色,比较寻找最相似颜色的颜色

对于它迭代的每种颜色,它都会将比较中的第二种颜色中的红色从第一种颜色中减去,然后是绿色,然后是蓝色。然后找到绝对值(没有负数)。然后将这些值相加,再除以三。这个数字是两种颜色之间的平均差值

一旦找到最接近的颜色,它将选择该颜色作为新的比较颜色,将其从原始颜色数组中移除,并将其推送到已排序的数组中。它会一直这样做,直到没有颜色为止

它确实需要一些工作,正如在提供更大的数据集时所看到的,但这是我昨晚仅有的时间。我会继续努力,直到我有更好的东西

const sort=data=>{
数据=对象。分配([],数据);
常量排序=[data.shift()];
while(data.length){
常数[a]=排序,c={d:无穷大};
for(让[i,b]为对象条目(数据)){
const average=Math.floor((
数学abs(a.r-b.r)+
数学abs(a.g-b.g)+
数学abs(a.b-b.b)
) / 3);
if(平均值{
document.body.insertAdjacentHTML('beforeend','${title}');
对于(让c表示数据){
document.body.insertAdjacentHTML('beforeend',`');
}
回归试验;
}
常数数据=[
{“hex”:“fe4670”},{“hex”:“5641bc”},{“hex”:“d53fc3”},{“hex”:“6b5e09”},
{“hex”:“#4dd685”},{“hex”:“#88d63f”},{“hex”:“#eb93f3”},{“hex”:“#f44847”},
{“hex”:“#32d159”},{“hex”:“#6e9bde”},{“hex”:“#c3ec64”},{“hex”:“#81cce5”},
{“hex”:“#7233b6”},{“hex”:“#bb90c3”},{“hex”:“#728fde”},{“hex”:“#7ef46a”},
{“hex”:“#f7cfff”},{“hex”:“#c8b708”},{“hex”:“#b45a35”},{“hex”:“#589279”},
{“hex”:“#51f1e1”},{“hex”:“#b1d770”},{“hex”:“#db463d”},{“hex”:“#5b02a2”},
{“hex”:“#909440”},{“hex”:“#6f53fe”},{“hex”:“#4c29bd”},{“hex”:“#3b24f8”},
{“hex”:“#465271”},{“hex”:“#6243”},{“hex”:“#dbcc4”},{“hex”:“#187c6”},
{“hex”:“#1085e2”},{“hex”:“#b521e9”},{“hex”:“#4bd36d”},{“hex”:“#11bc34”},
{“十六进制”:“#455c47”},{“十六进制”:“#a71bbf”},{“十六进制”:“#988fc2”},{“十六进制”:“#226cfe”}
].reduce((m,e)=>(m.push)对象分配(e{
r:parseInt(e.hex.substring(1,3),16)| | 0,
g:parseInt(例如十六进制子串(3,5),16)| | 0,
b:parseInt(e.hex.substring(5,7),16)| | 0
})),m),[]);
常量bigdata=(()=>{
常量数据=[];
const rand=()=>Math.floor(Math.random()*256);
对于(设i=0;i<1000;++i){
push({r:rand(),g:rand(),b:rand()});
}
返回数据;
})();
测试('Unsorted',data)('Sorted',sort(data))('A bigdata',sort(bigdata))
swatch{显示:内联块;边框:1px实心;左边距:1px;边距顶部:1px;宽度:20px;高度:20px;}
h2{margin:0;font-family:Verdana,Tahoma,“Sans-Serif”}
仅此而已(我想你已经读过这篇文章了)