给出一组数字,有什么方法可以调整一个数字并按比例分摊数组中其他项目的某些的差异?
下式给出:
var array = [10,20,30,40,50]
- &GT;将第三项向上调整30并在第一项和最后一项中减去按比例,使得项目总和仍然总计为150(数组中的第二和第四个元素是固定的或应保持不变)。< / p>
=应该出现:[5,20,60,40,25]
(理想情况下是javascript,但如果可以的话,我可以从C#/ VB.net翻译)
答案 0 :(得分:1)
这是一个通用的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/。
答案 1 :(得分:1)
我认为以下代码段可以提供帮助:
function amortize(array, updatedValueIndex, delta, amortizeIndexes){
var sum = 0;
for(var i = 0; i < amortizeIndexes.length; i++){
sum += array[amortizeIndexes[i]];
}
for(var i = 0; i < amortizeIndexes.length; i++){
array[amortizeIndexes[i]] -= delta * array[amortizeIndexes[i]] / sum;
if (array[amortizeIndexes[i]] < 0) array[amortizeIndexes[i]] = 0;
}
array[updatedValueIndex] += (delta > sum) ? sum : delta;
return array;
}
amortize([10,20,30,40,50], 2, 30, [0, 4]);