与えられた16進値に応じて最も一致する色の名前を取得しようとします。たとえば、16進数の#f00
の場合は、red
という色名を取得する必要があります。私は、最も近い色の名前を取得するには、現在レーベンシュタイン距離のアルゴリズムを使用し16進数に応じて最も近い色の名前を取得
'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'
、これまでのところうまく動作しますが、時々期待できないとして。例えば
:
'#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) {
// http://stackoverflow.com/q/11919065/1250044#comment16113902_11919065
return arr.sort(function (a, b) {
return levDist(a, str) - levDist(b, str);
});
};
}());
http://jsfiddle.net/ARTsinn/JUZVd/2/
もう一つはパフォーマンスです:
は、ここで私が最も近い色を取得するために作られたものです!これは本当に遅くなるような大きな問題があるようです(アルゴリズムなのでしょうか?)。
もっと類似した色の場合は、代わりに[HSL](https://en.wikipedia.org/wiki/HSL_and_HSV)の色を使用する方がよいでしょう。 – Sirko
並べ替える前に距離をあらかじめ計算しておけば、並べ替えの手順を**ロット**にすることができます。 – Pointy
また、単純なデカルト距離計算を使用しない理由はわかりません。 (実際には、私は角度座標空間に変換し、HSLまたはHSV ternsの距離を行いますね) – Pointy