作者:龙欣23 | 来源:互联网 | 2022-12-06 17:45
我需要一些帮助,使用来自其他列的数据并使用用户定义的等式动态计算HTML表格列.
例如,如果用户将等式C1 + C2 * 0.5 + C3 * 0.8
输入到输入框中,则表格需要根据等式中定义的列中的数据计算最后一列(C1 =列1,C2 =列2 ...).
我的表数据如下所示:
Student ID | Homework 1 | Homework 2 | Exam points | Final Grade
1 8.75 7.60 55.50 -
2 9.00 4.50 63.00 -
3 7.75 7.40 45.50 -
如果用户在C1 + C2 * 0.5 + C3 * 0.8
输入中输入等式,则表格应执行操作并根据该等式填充最终等级列.
结果看起来应该是这样的.
Student ID | Homework 1 | Homework 2 | Exam points | Final Grade
1 8.75 7.60 55.50 56.95
2 9.00 4.50 63.00 61.65
3 7.75 7.40 45.50 47.85
最终成绩的第一行将按此计算(8.75 + 7.60*0.5 + 55.50*0.8).
这是我在HTML中的主体:
Student ID
Homework 1
Homework 2
Exam points
Final grade
1
8.75
7.60
55.50
-
2
9.00
4.50
63.00
-
3
8.75
7.60
55.50
-
任何帮助将不胜感激!
1> Roko C. Bulj..: 这是一个使用邪恶eval
(!)的示例。
适用于任意数量的单元格 (大写或小写C
标识符)。
如果主题单元格无效, 则结果为"NaN"
。
如果提供的方程式无效, 则结果为"-"
基本上它创建具有相同的附图标记的对象{"c1":8.75, "c2":7.60, ...}
,比它EVAL S上的输入字符串替换c*
与相应对象值的出现。
function calcGrades() {
const val = this.value.toLowerCase().trim();
$("#grades tbody tr").each((i, TR) => {
let res;
const refs = $("td",TR).get().reduce((ob, TD, i) =>
[ob["c"+i] = parseFloat(TD.textContent), ob][1], {});
try { res = eval(val.replace(/c\d+/g, $1 => refs[$1])).toFixed(2) }
catch (err) { res = "-" }
$(".final-grade",TR).text( res );
});
}
$("#equation").on("input", calcGrades).trigger("input");
ID Homework 1 Homework 2 Exam pts Final
1 8.75 7.60 55.50 -
2 9.00 4.50 63.00 -
3 7.75 7.40 45.50 -
4 0 0.0 0 -
4 foo bar baz -