Вот JS-функция общего назначения, чтобы равномерно распределить корректировку по всем остальным элементам в массиве:
var array = [10,20,30,40,50];
function amortize(list, index, amount) {
if (list.length <= 1) return; // can't amortize with 0 or 1 items in list
var remaining = amount / (list.length - 1);
list[index] += amount;
for (var i = 0; i < list.length; i++) {
if (i != index) {
list[i] -= remaining;
}
}
}
Если вы действительно хотите, чтобы универсальная функция просто настраивала концы и оставляла те по обе стороны от середины нетронутыми, то вы бы просто сделали это:
var array = [10,20,30,40,50];
function amortizeEnds(list, amount) {
var remaining = amount / 2;
list[0] -= remaining;
list[4] -= remaining;
list[2] += amount;
}
Я не уверен, что понимаю ваш пропорциональный запрос, но вот тот, который дает вам запрошенный результат:
var array = [10,20,30,40,50];
function amortizeEndsProportional(list, amount) {
var endsTotal = list[0] + list[4];
var reductionProportion = amount / endsTotal;
list[0] = list[0] - list[0] * reductionProportion;
list[4] -= list[4] - list[4] * reductionProportion;
list[2] += amount;
}
Вы можете увидеть последнюю работу здесь: http://jsfiddle.net/jfriend00/QayQp/.