如何使用用户定义的等式计算HTML表列(使用javascript或jquery)

Nun*_*z19 5 html javascript math jquery

我需要一些帮助,使用来自其他列的数据并使用用户定义的等式动态计算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         -
Run Code Online (Sandbox Code Playgroud)

如果用户在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
Run Code Online (Sandbox Code Playgroud)

最终成绩的第一行将按此计算(8.75 + 7.60*0.5 + 55.50*0.8).

这是我在HTML中的主体:

<div>
    <input id="equation">
</div>
<table>
    <tr>
        <th>Student ID</th>
        <th>Homework 1</th>
        <th>Homework 2</th>
        <th>Exam points</th>
        <th>Final grade</th>
    </tr>
    <tr>
        <td>1</td>
        <td>8.75</td>
        <td>7.60</td>
        <td>55.50</td>
        <td class="final-grade">-</td>
    </tr>
    <tr>
        <td>2</td>
        <td>9.00</td>
        <td>4.50</td>
        <td>63.00</td>
        <td class="final-grade">-</td>
    </tr>
    <tr>
        <td>3</td>
        <td>8.75</td>
        <td>7.60</td>
        <td>55.50</td>
        <td class="final-grade">-</td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Rok*_*jan 5

这是一个使用邪恶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");
Run Code Online (Sandbox Code Playgroud)
<input id="equation" type="text" value="C1 + c2 * 0.5 + C3 * 0.8">
<table id="grades">
  <thead>
    <tr>
        <th>ID</th><th>Homework 1</th><th>Homework 2</th><th>Exam pts</th><th>Final</th>
    </tr>
  </thead>
  <tbody>
    <tr><td>1</td><td>8.75</td><td>7.60</td><td>55.50</td><td class="final-grade">-</td></tr>
    <tr><td>2</td><td>9.00</td><td>4.50</td><td>63.00</td><td class="final-grade">-</td></tr>
    <tr><td>3</td><td>7.75</td><td>7.40</td><td>45.50</td><td class="final-grade">-</td></tr>
    <tr><td>4</td><td>0</td><td>0.0</td><td>0</td><td class="final-grade">-</td></tr>
    <tr><td>4</td><td>foo</td><td>bar</td><td>baz</td><td class="final-grade">-</td></tr>
  </tbody>
</table>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)