I'm trying to build a hexadecimal color comparator which compares values in an array and deletes the ones that are similar keeping colors with the most pixels.
Here's an example of what the input looks like, the length of the array can change from 1 to more :
[…]
0: Array [ "ffffff", 12992 ]
1: Array [ "da542f", 3117 ] #similar
2: Array [ "da5630", 60 ] #similar
length: 3
(index: Array [hexColor, NumberOfPixel])
The output would look like this :
[…]
0: Array [ "ffffff", 12992 ]
1: Array [ "da542f", 3117 ]
length: 2
What I come up with, since the example below is super hardcoded and produce bugs I'd like to avoid having multiple if/else inside each other, hexColorCalc()
function comes from this post :
// ordered by highest pixel
colors_lst = [
["333333", 6421],
["da542f", 3117],
["da5630", 60]
]
console.log(colors_lst);
function hexColorDelta(array) {
function hexColorCalc(hex1, hex2) {
// get red/green/blue int values of hex1
var r1 = parseInt(hex1.substring(0, 2), 16);
var g1 = parseInt(hex1.substring(2, 4), 16);
var b1 = parseInt(hex1.substring(4, 6), 16);
// get red/green/blue int values of hex2
var r2 = parseInt(hex2.substring(0, 2), 16);
var g2 = parseInt(hex2.substring(2, 4), 16);
var b2 = parseInt(hex2.substring(4, 6), 16);
// calculate differences between reds, greens and blues
var r = 255 - Math.abs(r1 - r2);
var g = 255 - Math.abs(g1 - g2);
var b = 255 - Math.abs(b1 - b2);
// limit differences between 0 and 1
r /= 255;
g /= 255;
b /= 255;
// 0 means opposit colors, 1 means same colors
return (r + g + b) / 3;
}
// Do nothing since nothing to compare
if (array.length == 1) {
console.log('length of array : 1');
return array
}
// Just compare both values and erase the one with least pixel
if (array.length == 2) {
console.log('length of array : 2');
var hex1 = array[0][0];
var hex2 = array[1][0];
if (hexColorCalc(hex1, hex2) > 0.9) {
colors_lst = array.pop(); // Get ride of last item in array
return colors_lst;
}
}
// Problems
if (array.length == 3) {
var hex1 = array[0][0];
var hex2 = array[1][0];
var hex3 = array[2][0];
// if True, other if/else below won't be working
if (hexColorCalc(hex1, hex2) > 0.9) {
array.splice(2, 1);
}
if (hexColorCalc(hex1, hex3) > 0.9) {
array.splice(3, 1);
}
if (hexColorCalc(hex2, hex3) > 0.9) {
array.splice(2, 1);
}
return array
}
}
console.log(hexColorDelta(colors_lst));
I commented out how the code works, I'm having some trouble understanding the correct algorithm for this problem. How can I avoid the hardcoding and return a proper list without similarities?