减少jquery选择器

时间:2016-11-17 10:33:18

标签: javascript jquery

我使用的代码看起来像这样:



$(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>&nbsp;%</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>&nbsp;%</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>&nbsp;%</td>
  <td>&nbsp;&nbsp;<strong>=</strong> 
  </td>
  <td>
    <input class="form-control" disabled="disabled" id="total-weight" type="number">
  </td>
  <td>&nbsp;%</td>
  <td class="buttonPadding">
    <button type="submit" class="action-mainbtn">Save</button>
  </td>
</tr>
&#13;
&#13;
&#13;

注意:我必须使用的jQuery版本实际上是1.12.1(在SO片段工具中不可用)

仅供参考:我已经定义了specialParseFloat,错误可能与此无关。无论如何,功能如下:

function specialParseFloat(something) {
    return parseFloat(something) || 0;
}

我在浏览器(FF)中获得的行为是reduce仅返回最后一个值,而不是在输入框中添加所有值。然而,这仅适用于只有两个输入的情况。

我做错了什么?

2 个答案:

答案 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个位置开始。