AngularJS Filter无需创建新对象

时间:2015-07-02 14:48:05

标签: javascript arrays angularjs

我有一个对象数组,每个对象都包含子对象。该数组用于ng-repeat以打印数据表。一个例子如下:

    device {
       "name": "computer"
       ip_addresses {
           "address" : "127.0.0.1",
           "network" : "internet"
       }
       components {
          "type" : "network interface",
          "serial" : "12345"
       }
    }

我创建了一个过滤器,将对象展平为一个字符串,并在整个字符串中搜索输入的查询(不仅可以搜索外部对象,还可以搜索内部对象)。

过滤器有效,但我不断收到摘要错误。到目前为止,我已经尝试了两种方法,第一种方法是将要删除的对象拼接出数组,这会导致过滤器永久生效,这是不可取的(一旦过滤掉对象,它就会被永久删除)。

    return function (input, filterStr) {
            for (var i = 0; i < input.length; i++) {
                if (JSON.stringify(input[i]).toUpperCase().indexOf(filterStr.toUpperCase()) == -1)
                {
                    input.splice(i, 1);
                }           
            }

            return input;
        }

我尝试过的另一种方法是创建一个新数组并将匹配元素添加到新数组中。因为这会创建一个新数组,AngularJS会将输出数组中的对象识别为与输入数组中的对象不同,它会再次标记它们,从而生成摘要错误。

    return function( items, filterStr) {
            var filtered = [];
            angular.forEach(items, function(item) {
                if (JSON.stringify(item).toUpperCase().indexOf(filterStr.toUpperCase()) != -1)
                {
                    filtered.push(item);
                }           
            });
            return filtered;
        };

所以我的问题是:如何在不修改原始数组的情况下创建过滤后的输出数组,而不创建新数组(I.E.如何生成过滤后的数组而不存在摘要错误的风险)?

1 个答案:

答案 0 :(得分:0)

我希望能提供帮助,你可以试试这个:

function(items, filterStr) {
    var filtered = [];
    angular.forEach(items, function(item) {
        items.push(filtered: item);
    });
}