Javascript 使用ng repeat时如何获取数组的规范化值

Javascript 使用ng repeat时如何获取数组的规范化值,javascript,angularjs,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,我正在尝试获取与不同组关联的一个数组的规范化值 我不想在原始数组项中添加新的内容,因此我将为每个组的规范化项返回新对象 $scope.nomalizedItems = function (groupid) { var groupItems = $scope.originalItems.filter(function (item) { return item.groupid == groupid }); var values = groupItems.m

我正在尝试获取与不同组关联的一个数组的规范化值

我不想在原始数组项中添加新的内容,因此我将为每个组的规范化项返回新对象

$scope.nomalizedItems = function (groupid) {
    var groupItems = $scope.originalItems.filter(function (item) {
        return item.groupid == groupid
    });

    var values = groupItems.map(function (item) {
        return item.value;
    });
    var maxValue = Math.max.apply(null, values);
    return groupItems.map(function (item) {
        return {
            id: item.id,
            normalizedValue: item.value / maxValue
        };
    });
};
我相信这个逻辑非常简单,但是angularjs总是指责“
[$rootScope:infdig]10$digest()迭代已达到。正在中止!
”,即使我在ng repeat表达式中添加了“
track by item.id


你知道如何解决这个问题吗?谢谢

ngRepeat
指令不满意。您的代码每次都会创建新对象。消化循环一遍又一遍

据我所知,
按表达式跟踪
不应在通过重新创建实体擦除其所有内部
$$hashKey
属性后,使以前的实体与相应的新实体进行角度匹配。此指令旨在告诉
ngRepeat
指令如何构建此内部
$$hashKey
,以避免DOM元素创建浪费

所以。。您只能更改项目,而不能创建新项目:

    groupItems.forEach(function (item) {
        item.normalizedValue = item.value / maxValue;
    });
    return groupItems;
然后它就起作用了

此外,在每个摘要循环中都会进行过滤。出于性能目的,您可能更喜欢在特定事件/观察者回调中烘焙此数组

更新


实际上,如果您在
ngRepeat
表达式之外烘焙此列表,则消化不会反复循环!我建议您使用由
ngRepeat
指令创建的子作用域,为每个
组配备一个控制器,并在watcher回调中烘焙此列表。

我在Angular工作已经有一段时间了,所以我记不清它是如何工作的,或者它是否适用于您的情况,但这就是我通过过滤器@WalterStabosz处理分组的方式,谢谢链接。它不仅是分组,还需要对分组项进行聚合以获得最大值。这是最棘手的部分,因为我无法使用过滤器来获取最大值。嗯,我尝试过直接修改范围数据。那确实有效。不幸的是,我不喜欢这种方式,因为它会向数据中添加新的内容。但也许这是目前唯一的解决办法?很好地解释了为什么总是显示此错误。我会接受这是我选择的答案!