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);//就地修改并返回结果
我设置了一个adhoctestFn
函数,该函数处理使用参数调用函数的问题,并在控制台中显示结果以及检查总百分比的条件
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我通过从函数中删除调试逻辑对其进行了改进。我写了一个临时测试函数。