2 回答

TA貢獻1744條經(jīng)驗 獲得超4個贊
不確定是否足夠優(yōu)雅。我不會為此使用函數(shù)式編程,簡單的循環(huán)就足夠了。由于邊界條件(當條件觸發(fā)時,它應(yīng)應(yīng)用于下一個值),此分配非常棘手。這意味著要么有一些 if 子句,要么只是反向迭代。
簡單的java代碼:
double[] values = {0.35, 0.12,0.05,0.25,0.23 };
double cumulative = 0;
for(int i = values.length-1; i >= 0 ; i--) {
? ? cumulative += values[i];
? ? double c = cumulative < 0.5 ?? cumulative? :1 - cumulative + values[i];
? ? System.out.println("c[" + i + "]=" + c );
}
生產(chǎn):
c[4]=0.23
c[3]=0.48
c[2]=0.52
c[1]=0.47
c[0]=0.35
JavaScript 版本是:
const data = [
? ? { value: 0.35, name: 'a' },
? ? { value: 0.12, name: 'b' },
? ? { value: 0.05, name: 'c' },
? ? { value: 0.25, name: 'd' },
? ? { value: 0.23, name: 'e' },
];
for(let i = data.length - 1, cumulated = 0; i >= 0; i--) {
? ? cumulated += data[i].value;
? ? data[i].cumulated = cumulated < 0.5 ? cumulated : 1 - cumulated + data[i].value;
}
console.log(data);

TA貢獻1779條經(jīng)驗 獲得超6個贊
您可以對總和進行閉包,并在加/減值的前半部分或后半部分設(shè)置一個標志。
對于最后一個對象,采用原始值以省略浮點運算錯誤。
const
data = [{ value: 0.35, name: 'a' }, { value: 0.12, name: 'b' }, { value: 0.05, name: 'c' }, { value: 0.25, name: 'd' }, { value: 0.23, name: 'e' }],
result = data.map(((cumulativeValue, first) => (o, i, { length }) => {
if (first) cumulativeValue += o.value;
const temp = { ...o, cumulativeValue };
if (!first) cumulativeValue -= o.value;
if (cumulativeValue > 0.5) {
first = false;
cumulativeValue = 1 - cumulativeValue;
}
return i + 1 === length
? { ...o, cumulativeValue: o.value }
: temp;
})(0, true))
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
添加回答
舉報