Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Typescript_Algorithm_Charts - Fatal编程技术网

Javascript 分配百分比的算法

Javascript 分配百分比的算法,javascript,arrays,typescript,algorithm,charts,Javascript,Arrays,Typescript,Algorithm,Charts,假设我有这个物体 const data = { bills: 10, rent: 40, food: 50, } 它们等于100分(或100%) 现在让我们假设我将账单赋值为20。这将使其他属性像这样更新 { bills: 20, rent: 30, food: 50, } 或 没关系 我有我写的这段代码,但有时,当我给一个属性赋值时,其中一个属性会下降,因为总和是102,所以其中一个值是-2。如图所示: 这段代码是: allocate

假设我有这个物体

 const data = {
      bills: 10,
      rent: 40,
      food: 50,
    }
它们等于100分(或100%)

现在让我们假设我将
账单
赋值为20。这将使其他属性像这样更新

{
 bills: 20,
 rent: 30,
 food: 50,
}

没关系

我有我写的这段代码,但有时,当我给一个属性赋值时,其中一个属性会下降,因为总和是102,所以其中一个值是-2。如图所示:

这段代码是:

 allocatePercentage(dataName, percentage) {
    const curr = this.data[dataName];
    this.data[dataName] = percentage;
    if (percentage === 100) {
      Object.keys(this.data).filter(key => key !== dataName).forEach(dataKey => {
        this.data[dataKey] = 0;
      });
    } else {
      const {[dataName]: current, ...rest} = this.data;
      Object.keys(rest).forEach(key => {
        this.data[key] = this.data[key] - ((percentage - curr) / Object.keys(rest).length);
      });
    }
}
您可以这样使用它:

allocatePercentage('bills', 20);
Bills = 90
Rent = 10
Food = 0

if bills now is 100,
Bills = 100
Rent = 10-(100-90)/2 = 5
Food = 0 - (100-90)/2 = -5
让我们假设对象是:

{
  bills: 10,
  rent: 40,
  food: 50,
}
租金:

data['rent'] = 40 - ((20 - 10) / 2) // 35
食物:

data['food'] = 50 - ((20 - 10) / 2) // 45
那为什么有时会产生负的%值呢?(如图所示)


如何防止这种行为并正确分配百分比?

请这样思考:

allocatePercentage('bills', 20);
Bills = 90
Rent = 10
Food = 0

if bills now is 100,
Bills = 100
Rent = 10-(100-90)/2 = 5
Food = 0 - (100-90)/2 = -5

因此,计算不能取相等的部分。当任何类别变为或为0时,您需要处理该情况。

您的答案不是20/36/44吗?您将得到100和旧值的差值,并将其用作乘数。我看到很多ES6 spead魔术正在发生,但有时最好从更传统的意义上理解它

{
“法案”:20,
“租金”:36,
“食物”:44
}
重新分配
功能(如下所示)应通过以下方式调用:

重新分配(数据,'bills',20);//就地修改并返回结果
我设置了一个adhoc
testFn
函数,该函数处理使用参数调用函数的问题,并在控制台中显示结果以及检查总百分比的条件

const DEBUG=true;
const valuesEqual=(obj,预期)=>Object.values(obj)
.减少((acc,v)=>acc+v,0)==预期值;
常量testFn=(fn,…args)=>
(res=>console.log(JSON.stringify(res),“/”,valuesEqual(res,100)))
(fn(…args));
const data={账单10张,房租40张,食物50张};
常量重新分配=(类别、类别、值)=>{
const oldVal=类别[类别]| | 0,
newValue=类别[类别]=值,
其他=100-旧值,
差异=新值-旧值,
乘数=(其他-差异)/其他;
适用于(类别中的常量类别){
如果(类别!==类别){
类别[cat]=数学轮(类别[cat]*乘数);
}
}
退货类别;
}
testFn(重新分配,{……数据},'bills',20);//更新-增量
testFn(重新分配,{…数据},'bills',5);//更新-减量
testFn(重新分配,{…数据},'entertainment',10);//创造
testFn(重新分配,{…数据},'bills',0);//更新-分钟
testFn(重新分配,{…数据},'bills',100);//更新-最大值

。作为控制台包装{top:0;最大高度:100%!important;}
这很有意义。在对象属性的数量是动态的情况下,如何纠正这种行为?(账单、食物、租金、税收等)好吧,那要看你想如何将它分成不同的类别。因为,分配不会平均分配(一个或多个可能会变为0),所以问题是哪些类别可以去掉更多。它可以基于当前的百分比分配。我想我写这篇文章时在什么地方迷路了。这管用!谢谢。@filipbarak我通过从函数中删除调试逻辑对其进行了改进。我写了一个临时测试函数。