function getClosest(array, target) {
var tuples = _.map(array, function(val) {
return [val, Math.abs(val - target)];
});
return _.reduce(tuples, function(memo, val) {
return (memo[1] < val[1]) ? memo : val;
}, [-1, 999])[0];
}
Если применим функциональный подход, вы можете отобразить набор на кортежи (значение, расстояние), а затем уменьшить этот набор на кортеж с наименьшим расстоянием. Мы возвращаем значение в этом кортеже.
Чтобы объяснить использование _.map
. Вы отображаете все значения в вашем массиве на новые значения, и функция будет возвращать массив новых значений. В этом случае массив кортежей.
Чтобы объяснить использование _.reduce
. Вы уменьшаете массив до одного значения. Вы передаете в массив и памятку. Памятка - это ваш «счетчик хода», когда вы перемещаетесь по массиву. В этом случае мы проверяем, находится ли текущий кортеж ближе, чем памятка, и, если это так, делаем его памяткой. Затем мы возвращаем записку в конце.
Приведенный выше фрагмент кода опирается на underscore.js для удаления мелочей из функционального стиля javascript