自定义组中的Infdig

时间:2016-09-20 06:16:09

标签: angularjs angularjs-ng-repeat

我最近需要一些有针对性的定制中继器,它按键分组数据,但不是简单地将它们组合在一起,所以我读了几个引用和东西,......最后我来复制 groupBy从这篇文章中他似乎最多只能完成它,...... http://sobrepere.com/blog/2014/10/14/creating-groupby-filter-angularjs/ 然后我定制,所以它变成这样:

我的小组所做的事情......是:

将数据组合在一起直到达到差异。 但问题是,虽然它有效,但它仍然会产生infdig,我知道这是因为摘要完成了另一个,但我不知道的是如何以非常容易和可理解的方式解决它,因为我是新手的JavaScript ...

        app.filter('groupBy', function () {
            var results = {};
            return function (data, key) { //Data => My Objects Array - Key => Name Of Filtered Property
                if (!(data && key)) return;
                var result;
                if (!this.$id) {
                    result = {};
                } else {
                    var scopeId = this.$id;
                    if (!results[scopeId]) {
                        results[scopeId] = {};
                        this.$on("$destroy", function () {
                            delete results[scopeId];
                        });
                    }
                    result = results[scopeId];
                }

                for (var groupKey in result)
                    result[groupKey].splice(0, result[groupKey].length);

                var grpKey = -1; //GroupKey
                var lastUserId;
                for (var i = 0; i < data.length; i++) {
                    if (!result[grpKey] || lastUserId && lastUserId != data[i][key]) // Ex.: result[data[0]["UserId"]]{ => return UserId
                        result[++ grpKey] = [];

                    result[grpKey].push(data[i]);
                    lastUserId = data[i][key];
                }

                var keys = Object.keys(result);
                for (var k = 0; k < keys.length; k++) {
                    if (result[keys[k]].length === 0)
                        delete result[keys[k]];
                }
                return result;
        };
             });

1 个答案:

答案 0 :(得分:0)

在这个网址中工作正常...              http://plnkr.co/edit/8jB4wSRtKfVmEsTGZtfV?p=preview

          app.filter('groupBy', function ($timeout) {
          return function (data, key) {
    if (!key) return data;
    var outputPropertyName = '__groupBy__' + key;
    if(!data[outputPropertyName]){
        var result = {};  
        for (var i=0;i<data.length;i++) {
            if (!result[data[i][key]])
                result[data[i][key]]=[];
            result[data[i][key]].push(data[i]);
        }
        Object.defineProperty(result, 'length', {enumerable: false, value: Object.keys(result).length});
        Object.defineProperty(data, outputPropertyName, {enumerable:false, configurable:true, writable: false, value:result});
        $timeout(function(){delete data[outputPropertyName];},0,false);
        }
     return data[outputPropertyName];
            };
    });