Get closest

http://stackoverflow.com/questions/15986800/get-the-closest-value-for-combinations-of-an-array-js#15986800

by laucheukhim

HTML

<table id="result"></table>

CSS

#result {
    font-family: monospace;
}
td.test {
    font-weight: bold;
    text-align: right;
    padding-right: 1em;
}

JavaScript

function getClosest(array, target) {
	array = array.sort(function(a, b) { return a - b; });
	var current = [], j = 0, least;
	
	do {
		j++;
		sum = 0;
		for(var i in current) { sum += current[i]; }
		var results = [];
		for (var i in array) {
			var diff = Math.abs(sum + array[i] - target);
			if (diff >= least) {
				break;
			}
			results.push([array[i],diff]);
		}
		if (results.length) {
			results.sort(function(a, b) {return a[0] - b[0]}).sort(function(a, b) {return a[1] - b[1]});
			current.push(results[0][0]);
			least = results[0][1];
		}
	} while (results.length);
	
	var output = [];
	for (var i in current) { output.push(current[i].toFixed(1)) };
	return output.join("+");
}

var table = '';
var test = [1,2.5,4.8,7.3];
for (var i = 0; i<10; i+=0.1) {
	table += '<tr><td class="test">'+i.toFixed(1)+"</td><td>"+getClosest([0.5, 1.0, 1.5, 2.0, 3.0], i)+"</td></tr>";
}
document.getElementById("result").innerHTML = table;