我有一個對象數組,每個對象都包含子對象。該數組用於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;
};
所以我的問題是:如何創建一個過濾輸出數組,而不修改原始數組,並不會產生一個新的數組(即我怎麼沒有產生消化的誤差風險濾波陣列)?
可以[memoize的(https://en.wikipedia.org/wiki/Memoization)過濾功能,因此對於同樣的參數不eval函數再次,但返回memoize值。例如:http://www.terrencewatson.com/2014/06/28/memoize/ – Grundy