20231208 TIL
let numericRanksPower = sortedData
.map(item => item['COLUMN_NAME'])
.filter(rank => !isNaN(rank) && rank !== null && rank !== '');
const maxRankPower = Math.max(...numericRanksPower);
const minRankPower = Math.min(...numericRanksPower);
Math.max
와 Math.min
은 입력된 숫자 중 가장 큰 숫자와 작은 숫자를 반환한다. 포인트는 만약 인수 중 하나라도 숫자로 변환하지 못한다면 NaN로 반환한다는 것!.filter(rank => !isNaN(rank) && rank !== null && rank !== '')
요 코드로 숫자로 변환하지 못할 case를 방지한다.function getRankColorPower(rank) {
if (isNaN(rank) || rank === null || rank === '') {
return 'transparent'; // Or any default color for non-numeric values
}
// Interpolate color based on rank
const proportion = (rank - minRankPower) / (maxRankPower - minRankPower);
return interpolateColor('#FF5A00', '#FFD9C6', proportion);
}
interpolateColor
라고 해보자.function hexToRgb(hex) {
let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
정규표현식/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i
:
exec()
: 정규식 실행! 문자열이 패턴과 일치하면 코드는 일치하는 전체 문자열과 일치하는 그룹(빨강, 녹색, 파랑 구성 요소)이 포함된 배열을 반환. 문자열이 일치하지 않으면 코드는 null을 반환.
예시
let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec('#FF5A00');
console.log(result)
parseInt(result[i], 16)
: 16진수를 10진수로 반환. 각 구성 요소(r, g, b)는 색상의 빨강, 녹색, 파랑의 강도를 나타내며 0에서 255 사이의 값을 가짐. function interpolate(start, end, proportion) {
return Math.round(start + (end - start) * proportion);
}
interpolate(0, 10, 0.25)
는 3을 반환! function interpolateColor(color1, color2, proportion) {
let color1RGB = hexToRgb(color1);
let color2RGB = hexToRgb(color2);
let resultRGB = {
r: interpolate(color1RGB.r, color2RGB.r, proportion),
g: interpolate(color1RGB.g, color2RGB.g, proportion),
b: interpolate(color1RGB.b, color2RGB.b, proportion),
};
return `rgb(${resultRGB.r}, ${resultRGB.g}, ${resultRGB.b})`;
}