如果数组已排序且较大,请使用二进制印章查找最接近的元素:
var getClosestValues = function(a, x) { var lo = -1, hi = a.length; while (hi - lo > 1) { var mid = Math.round((lo + hi)/2); if (a[mid] <= x) { lo = mid; } else { hi = mid; } } if (a[lo] == x) hi = lo; return [a[lo], a[hi]];}否则,只需从一端扫描到另一端,并跟踪目标上方和下方的最接近值。不幸的是,对于该算法,您的版本已损坏。这是另一个版本:
var getClosestValues = function(a, x) { var lo, hi; for (var i = a.length; i--;) { if (a[i] <= x && (lo === undefined || lo < a[i])) lo = a[i]; if (a[i] >= x && (hi === undefined || hi > a[i])) hi = a[i]; }; return [lo, hi];}


