使用循环计算数组中新推送的数据

Posted

技术标签:

【中文标题】使用循环计算数组中新推送的数据【英文标题】:Compute the newly pushed data in array using loop 【发布时间】:2018-10-15 21:33:42 【问题描述】:

我无法正确计算循环内数组中的数值。

场景

tbody 生成动态值列表。 td 内部的button 有一个名为functionpreBookThis()params。 当用户点击button时,会触发function然后pushdata变成array variable。 在推送时,将有一个for loop 将迭代和计算值。 $scope.nights 是两个日期 - 即 2018-05-05 和 2018-05-07,因此其值为 2)

问题

假设tbody 中有三行,并且具有以下值。

$scope.nights = 2; row1 = 100; row2 = 200; row3 = 300;

当用户点击 第 1 行中的button,计算工作并按预期执行

amount_row1 = 200;

但是……

当用户点击第2行中的button时,第一行的计算值将加倍。

amount_row1 = 400; amount_row2 = 400;

还有……

当用户点击第3行中的button时,第一行和第二行的计算值将再次翻倍。

amount_row1 = 800; amount_row2 = 800; amount_row3 = 600;

最终输出应该是:

 amount_row1 = 200;
 amount_row2 = 400;
 amount_row3 = 600;

HTML

<tbody ng-repeat="room in roomsDisplay">
    <tr>
        <td>
            <div class="col-md-6"><img ng-src="images/rooms/room.room_image"></div>         
        </td>
        <td>
            <div style="margin-top: 20px;"><input type="button" 
                ng-click="preBookthis(room)" class="btn btn-primary" 
                value="Book this Room"></div>
        </td>
    </tr>
</tbody>

JS

$scope.preBookthis = function(data)
    $scope.totalAmount = 0;
    $scope.bookData.push( 
        'room_name': data.room.room_name, 
        'price': data.room.price,
        'amount': $scope.amount,
        'id' : data.room.rooms_type_id
    );

    _.forEach($scope.bookData, function(value, key)
        value.amount = value.amount * $scope.nights;
    );

【问题讨论】:

我无能为力,因为我对这个主题了解得不够多。但我想赞扬你一个非常详细和高质量的答案。我相信这会增加得到答复的机会。 非常感谢您的称赞。我希望有人能回答,因为我对此感到非常沮丧,无法解决。 方法的最后一行是干什么用的? 另外,您似乎乘以 $scope.nights 两次。 我在最后部分更新了我的代码,删除了可能会混淆其他人的不必要的代码。谢谢。 【参考方案1】:

在添加新对象时只进行一次计算,不要遍历已经计算过的所有其他对象

类似:

$scope.preBookthis = function(data)
    $scope.totalAmount = 0;
    $scope.bookData.push( 
        'room_name': data.room.room_name, 
        'price': data.room.price,
        'amount': $scope.amount * $scope.nights,// calculate only for this item
        'id' : data.room.rooms_type_id
    );  

【讨论】:

不错。没有考虑到这一点。当然比我的想法更好:D 我没看到那个。真是好工作。现在,我唯一的问题是所有pushed 数据中的total_amount。谢谢。 可以使用循环来获取总数或只是将新金额添加到现有总数中 很好,两者都能正常工作。无论如何,我还有其他问题,但这与我发布的问题无关。虽然它与这个相反,但我会先尝试自己解决它。谢谢。 反义词怎么去掉?如果是这样,这可能会有所帮助***.com/questions/15453979/…【参考方案2】:

问题源于 $scope.bookData 在函数被调用时被完全更改。

调用函数时,$scope.bookData 可能包含其他行的对象。这些对象具有amount 值。在您的循环中,将该值乘以 $scope.nights(即 2)。

因此,您将 所有 行的值乘以 2。

您反复更改amount 的值。

试试这个:

_.forEach($scope.bookData, function(value, key)
    value.amount = (key+1) * $scope.nights*100;
);

编辑:

其实,另一个answer 提供了更好的解决方案。

【讨论】:

非常感谢您的回答。但我相信 charlietfl 的答案是更好的答案。谢谢。

以上是关于使用循环计算数组中新推送的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 推送/获取数据并使用 Java 添加到二维数组?

如何一次将一个项目添加(推送)到一个数组(循环遍历数组)

从 api 推送数组数据会导致无限循环

计算python中新记录的滚动计数

Numpy基础:数组和矢量计算

使用 pine 脚本中的函数循环数组推送