编辑距离在这里并不合适,因为它会逐个字符地比较是否相等。您需要分别检查每种颜色,并且您想要79
更接近80
than 00
.
以下内容似乎更接近您想要的内容,只需对代码进行很少的更改:
Array.closest = (function () {
function dist(s, t) {
if (!s.length || !t.length) return 0;
return dist(s.slice(2), t.slice(2)) +
Math.abs(parseInt(s.slice(0, 2), 16) - parseInt(t.slice(0, 2), 16));
}
return function (arr, str) {
return arr.sort(function (a, b) {
return dist(a, str) - dist(b, str);
});
};
}());
请注意,只有当两者都存在时,这才会给出合理的结果s
and t
是 6 个字符的颜色十六进制代码。
您的代码效率低下,因为您不需要对整个数组进行排序以获得最接近的颜色。相反,您应该只循环遍历数组并跟踪最短距离。
例如:
Array.closest = (function () {
function dist(s, t) {
if (!s.length || !t.length) return 0;
return dist(s.slice(2), t.slice(2)) +
Math.abs(parseInt(s.slice(0, 2), 16) - parseInt(t.slice(0, 2), 16));
}
return function (arr, str) {
var min = 0xffffff;
var best, current, i;
for (i = 0; i < arr.length; i++) {
current = dist(arr[i], str)
if (current < min) {
min = current
best = arr[i];
}
}
return best;
};
}());
请注意,此更改后Array.closest()
将返回单个值而不是数组,因此您需要删除[0]
在你的代码中进一步。