2015-07-02 22 views
2

我有一個對象數組,每個對象都包含子對象。該數組用於ng-repeat以打印數據表。一個例子如下:AngularJS過濾器沒有製作新對象

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; 
     }; 

所以我的問題是:如何創建一個過濾輸出數組,而不修改原始數組,並不會產生一個新的數組(即我怎麼沒有產生消化的誤差風險濾波陣列)?

+0

可以[memoize的(https://en.wikipedia.org/wiki/Memoization)過濾功能,因此對於同樣的參數不eval函數再次,但返回memoize值。例如:http://www.terrencewatson.com/2014/06/28/memoize/ – Grundy

回答

0

我希望能幫助,你可以試試這個:

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

這是什麼代碼? – Grundy

相關問題