【发布时间】:2015-07-02 14:48:04
【问题描述】:
我有一个对象数组,每个对象都包含子对象。该数组在 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;
};
所以我的问题是:如何在不修改原始数组且不创建新数组的情况下创建过滤后的输出数组(即如何生成过滤后的数组而不会有摘要错误的风险)?
【问题讨论】:
-
您可以memoize 过滤函数,因此对于相同的参数,不再使用 eval 函数,而是返回 memoize 值。例如:terrencewatson.com/2014/06/28/memoize
标签: javascript arrays angularjs