【问题标题】:JQuery gather Sum of values inside each nested sectionJQuery 在每个嵌套部分内收集值的总和
【发布时间】:2013-02-25 21:35:13
【问题描述】:

我正在创建一个包含父任务和子任务的任务列表。它们以有序列表的形式排列,并且嵌套了很多层,因此父任务内部也可以有子任务和父任务。

例子:

    <div class="item-list">
    <ol>
     <li class="parent">
        <div class="title">Im a task</div>
        <div class="totalhours">total child hours here please</div>
        <ol>
          <li>
            <div class="title">Im a task</div>
            <div class="hours">5</div>
          </li>
          <li>
            <div class="title">Im a task</div>
            <div class="hours">10</div>
          </li>
          <li class="parent">
           <div class="title">Im a task</div>
           <div class="totalhours">total child hours here please</div>
           <ol>
             <li>
               <div class="title">Im a task</div>
               <div class="hours">5</div>
             </li>
             <li>
               <div class="title">Im a task</div>
               <div class="hours">10</div>
             </li>
          </ol>
         </li>
        </ol>
     </li>
     <li>Another task thats not a parent on this level</li>
    </ol>
    </div>

所以我希望每个级别都有所有嵌套项。因此,最顶层的父任务包括所有嵌套小时 div 的小时数,然后如果您向下钻取它,每个嵌套父级对其所有嵌套小时数都执行相同的操作,依此类推。

这是我目前正在使用的,它只是计算每个小时的 div,而不是只嵌套并在任何地方放置相同的数字。

    var totalest = $('li.parent .totalhours');

    var sum = 0;

    $("li .hours").each(function() {
        var val = $.trim( $(this).text() );

        if ( val ) {
            val = parseFloat( val.replace( /^\$/, "" ) );

            sum += !isNaN( val ) ? val : 0;
        }

        totalest.html(sum); 
    });

我希望这个结果

  • 我是家长任务 30 小时
    • 我的任务是 5 小时
    • 我的任务是 10 小时
    • 我是家长任务 15 小时
      • 我的任务是 5 小时
      • 我的任务是 10 小时
  • 我是另一个家长任务 20 小时
    • 我的任务是 5 小时
    • 我的任务是 5 小时
    • 我是家长任务 10 小时
      • 我的任务是 5 小时
      • 我的任务是 5 小时

【问题讨论】:

    标签: jquery sum nested-lists


    【解决方案1】:

    遍历每个父级并仅向该父级添加小时数。

    $(".parent").each(function() {
      var sum = 0;
      $(".hours", this).each(function() {
        var val = $.trim( $(this).text() );
    
        if ( val ) {
          val = parseFloat( val.replace( /^\$/, "" ) );
    
          sum += !isNaN( val ) ? val : 0;
        }
    
      });
      $(this).find('.totalhours').html(sum); 
    });
    

    http://jsfiddle.net/qqhD6/

    【讨论】:

    • 关闭谢谢。我正在运行它似乎正在收集随机数,但也有一些根本不总计。
    • 这实际上很完美。我认为我的问题是我最初没有单独的小时课程。我有单独的容器 div,它一定很困惑。例如 .parent-details .hours 和 .child-details .hours 再次感谢! @jsweazy
    【解决方案2】:

    诀窍是将其范围限定为每个父母。

    $('.parent').each(function(){
        var parent = $(this),
            total = parent.find('.totalHours'),
            sum = 0;
    
        parent.find('.hours').each(function(){
            var hours = $(this),
                text = $.trim(hours.text()),
                value = parseFloat(value);
    
            sum += !isNaN(value)?value:0;
        });
    
        total.html(sum);
    });
    

    【讨论】:

    • 我根本无法让这个工作,但我明白你的目的,它与 jsweazy 相似,因此试图以某种方式将两者结合起来以使其工作。 @尼科
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多