我尝试根据给定的十六进制值获取最匹配的颜色名称。例如,如果我们有十六进制颜色#f00
,我们需要获取颜色名称red
。
'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'
我目前使用的是Levenshtein距离算法来获取最接近的颜色名称,目前效果良好,但有时不如预期。
例如:
'#0769ad' => 'chocolate'
'#00aaee' => 'mediumspringgreen'
有什么建议可以让结果更接近吗?
以下是我用来获取最接近颜色的方法:
Array.closest = (function () {
// http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript
function levDist(s, t) {
if (!s.length) return t.length;
if (!t.length) return s.length;
return Math.min(
levDist(s.substring(1), t) + 1,
levDist(t.substring(1), s) + 1,
levDist(s.substring(1), t.substring(1)) + (s[0] !== t[0] ? 1 : 0)
);
}
return function (arr, str) {
// https://dev59.com/Gmct5IYBdhLWcg3wqfL9#comment16113902_11919065
return arr.sort(function (a, b) {
return levDist(a, str) - levDist(b, str);
});
};
}());
http://jsfiddle.net/ARTsinn/JUZVd/2/
另一个问题是性能!看起来有一个非常大的问题使得这个程序运行缓慢(是算法的问题吗?)。