javascript - 通过考虑每个范围的值共享剩余的 %,在 4 个范围输入之间共享 100%
问题描述
我有 4 个输入,我试图根据它们之前的价值分享它们的股权价值。
我想要实现的是,例如,如果我有一个 50% 的字段,另一个 25% 的字段,则其余字段将为 12.5% 如果我有两个字段为 29.75%,一个字段为 39.5%,最后一个字段为如果我有一个字段为 75%,一个字段为 20%,则为 1%,其他字段为 2.5%,依此类推。
这是我迄今为止尝试过的未成功的方法:
let ranges = [a,b,c,d];
let old_value = 1;
for(let rang of ranges)
{
rang.onfocus=(e)=>{
old_value=parseInt(e.target.value);
}
rang.onchange=(e)=>{
console.log(old_value);
let sortedRanges = ranges.filter(el=>el.name!=e.target.name);
for(let cur of sortedRanges)
cur.value-= (parseInt(e.target.value) - old_value)/4;
old_value = e.target.value;
}
}
<input name="a" id="a" type="range" value="25" min="1" max="100"/>
<input name="b" id="b" type="range" value="25" min="1" max="100"/>
<input name="c" id="c" type="range" value="25" min="1" max="100"/>
<input name="d" id="d" type="range" value="25" min="1" max="100"/>
我还尝试研究比例,例如,如果我有一个字段以前为 25,现在为 40,表示比例因子为 1.6,但我不知道这有什么用处。
此外,简单地将剩余百分比除以 3 的更简单方法不会将其削减,就好像另一个字段作为不同的值一样,三个剩余字段之间没有常规比率。
建议。
解决方案
const ranges = [a,b,c,d];
ranges.forEach(rangeElement => {
rangeElement.addEventListener('change', ({target: { value } }) => {
rangeElement.setAttribute('value', (+value).toFixed(2));
const rangeIndex = ranges.indexOf(rangeElement)
const previousRanges = ranges.slice(0, rangeIndex);
const nextRanges = ranges.slice(rangeIndex + 1);
const sumOfPrevious = +value + previousRanges.reduce((acc, {value}) => acc + +value, 0)
const valueOfRest = ((100 - sumOfPrevious) / nextRanges.length).toFixed(2)
nextRanges.forEach(range => range.setAttribute('value', valueOfRest));
})
})
input::after {
content: attr(value);
}
<input name="a" id="a" type="range" value="25" min="1" max="100"/>
<input name="b" id="b" type="range" value="25" min="1" max="100"/>
<input name="c" id="c" type="range" value="25" min="1" max="100"/>
<input name="d" id="d" type="range" value="25" min="1" max="100"/>
推荐阅读
- go - 初始化嵌套结构映射
- qt - 使用特定 QT 版本运行二进制文件 - 不能混合不兼容的 Qt 库
- twilio - 如何避免 twilio 错误 32011(与 SIP 通信基础设施通信时出错)
- python - 有没有办法删除字符串中标点符号的特定组合?
- python - LeetCode 762 为什么单独的代码适用于 Jupiter Notebook 而不是 Leetcode
- excel - 将特定数据从一个工作表传输到另一个工作表以生成报告
- dapper - Dapper & 多列到属性映射是否可能?
- macos - 需要检查 /dev/disk2 上的磁盘空间
- javascript - 使用 javascript 更新多级嵌套对象的值
- php - PHP 用户输入数据过滤以提交到 MySQL 数据库 - 建议