Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算累积镜面反射值_Javascript - Fatal编程技术网

Javascript 计算累积镜面反射值

Javascript 计算累积镜面反射值,javascript,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' }, ] 总数正好是1.0 这是我想要得到的结果: const data = [ { value: 0.35, name: 'a', cumu

假设我有这样一个对象数组:

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' },
]
总数正好是1.0

这是我想要得到的结果:

const data = [
  { value: 0.35, name: 'a', cumulativeValue: 0.35 },
  { value: 0.12, name: 'b', cumulativeValue: 0.47 },
  { value: 0.05, name: 'c', cumulativeValue: 0.52 },
  { value: 0.25, name: 'd', cumulativeValue: 0.48 },
  { value: 0.23, name: 'e', cumulativeValue: 0.23 },
]
逻辑是增加值,直到总和超过50,一旦超过该值,它就会计算从数组末尾开始的累积值

这是我的代码,它可以工作,但是有没有更优雅的方法呢

const数据=[
{value:0.35,名称:'a'},
{value:0.12,名称:'b'},
{value:0.05,名称:'c'},
{值:0.25,名称:'d'},
{value:0.23,名称:'e'},
]
函数computeCumulative(数据){
const newData=data.reduce((百分比、数据、i)=>{
const CumulativePercentage=i==0?0:PrevWithCumPercentage[i-1]。cumulativePercentageL
常数newDatum={
资料
累积百分比:datum.value+累积百分比,
}
prevWithCumPercentages.push(新数据)
返回百分比
}, []) 
const dataReverse=[…data].reverse().reduce((prevWithCumPercentage,datum,i)=>{
const CumulativePercentage=i==0?0:PrevWithCumPercentage[i-1]。cumulativePercentageR
常数newDatum={
资料
累计百分比:datum.value+累计百分比,
}
prevWithCumPercentages.push(新数据)
返回百分比
}, []) 
const data2=dataReverse.map((基准)=>{
const{cumulativePercentageL,cumulativePercentageR}=数据
const省略=省略(数据,['cumulativePercentageL','cumulativePercentageR']
常数累积百分比=

cumulativePercentageL不确定是否足够优雅。我不会为此使用函数式编程,因为简单循环就足够了。由于边界条件,此赋值非常棘手(当条件激发时,它将应用于下一个值)。这意味着要么是一些if子句,要么只是反向迭代。感谢@Yoshi指出这一点

简单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 );
}

javascript版本应为:

const数据=[
{value:0.35,名称:'a'},
{value:0.12,名称:'b'},
{value:0.05,名称:'c'},
{值:0.25,名称:'d'},
{value:0.23,名称:'e'},
];
对于(设i=data.length-1,累计=0;i>=0;i--){
累计+=数据[i]。数值;
数据[i]。累积=累积<0.5?累积:1-累积+数据[i]。值;
}

console.log(data);
您可以对总和进行闭包,并在值的加法/减法的前半部分或后半部分设置标志

对于最后一个对象,取原始值以忽略浮点算术错误

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'}],
结果=data.map((累积值,第一)=>(o,i,{length})=>{
如果(第一)累积值+=o.value;
常量温度={…o,累积值};
如果(!first)累积值-=o.value;
如果(累积值>0.5){
第一个=假;
累积值=1——累积值;
}
返回i+1==长度
?{…o,累积值:o.value}
:温度;
})(0,对)
console.log(结果)

.as控制台包装{max height:100%!important;top:0;}
您可以发布一个示例吗?在
c
条目上有一个小错误。但是您可以修复这个问题,如果您向后遍历:
for(让i=data.length-1,cumulated=0;i>=0;i--){/*…*/}
int
有效的JavaScript吗?@customcommander它是pseuqdocode(我主要是开发java和c——一些坏习惯和状态类型)不是问题。作为java开发人员,我更容易将Junit测试作为JS代码片段进行测试
c[4]=0.23
c[3]=0.48
c[2]=0.52
c[1]=0.47
c[0]=0.35