我使用的代码看起来像这样:
$(document).ready(function() {
var total = $('#exam-percent-weightage > td > input').not('[type=hidden]').not('[disabled=disabled]').get().reduce(function(a, b) {
return specialParseFloat(a === undefined ? 0 : a.value) + specialParseFloat(b === undefined ? 0 : b.value);
});
console.log(total);
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<tr id="exam-percent-weightage">
<td class="weightagePadding"> <strong>First Term</strong>
</td>
<td>
<input name="data[Exam][0][percent_weightage]" class="form-control percentWeight" value="0.00" step="any" id="Exam0PercentWeightage" type="number">
<input name="data[Exam][0][id]" class="testId" value="30" id="Exam0Id" type="hidden">
</td>
<td> %</td>
<td class="buttonPadding">+</td>
<td class="weightagePadding"> <strong>Second Term</strong>
</td>
<td>
<input name="data[Exam][1][percent_weightage]" class="form-control percentWeight" value="0.00" step="any" id="Exam1PercentWeightage" type="number">
<input name="data[Exam][1][id]" class="testId" value="31" id="Exam1Id" type="hidden">
</td>
<td> %</td>
<td class="buttonPadding">+</td>
<td class="weightagePadding"> <strong>Third Term</strong>
</td>
<td>
<input name="data[Exam][2][percent_weightage]" class="form-control percentWeight" value="0.00" step="any" id="Exam2PercentWeightage" type="number">
<input name="data[Exam][2][id]" class="testId" value="32" id="Exam2Id" type="hidden">
</td>
<td> %</td>
<td> <strong>=</strong>
</td>
<td>
<input class="form-control" disabled="disabled" id="total-weight" type="number">
</td>
<td> %</td>
<td class="buttonPadding">
<button type="submit" class="action-mainbtn">Save</button>
</td>
</tr>
&#13;
注意:我必须使用的jQuery版本实际上是1.12.1(在SO片段工具中不可用)
仅供参考:我已经定义了specialParseFloat,错误可能与此无关。无论如何,功能如下:
function specialParseFloat(something) {
return parseFloat(something) || 0;
}
我在浏览器(FF)中获得的行为是reduce仅返回最后一个值,而不是在输入框中添加所有值。然而,这仅适用于只有两个输入的情况。
我做错了什么?
答案 0 :(得分:1)
根据文档here,您必须将累加器设置为reduce的第三个参数,并使用它来添加您的值。因为你不使用累加器,你的最后一次评估将是最终结果。
答案 1 :(得分:0)
感谢Bastien Mercier,我重新阅读了文档。我做错了两件事。
首先,我认为reduce
的参数是(firstValue, secondValue)
(对我这么傻)而应该是(accumulator, currentValue)
其次,我没有传递initialValue,根据文档,它会导致索引从1开始。
现在更正是将a === undefined ? 0 : a.value
更改为a === undefined ? 0 : a
或仅a
(因为我们传递初始值)并将初始值0传递给强制执行reduce
从数组中的第0个位置开始。