我有javascript对象,如下所示:
{ name: 'Barney', color: 'blue', parent: {name: 'Henry'} }
当我在包含上述对象的数组上使用$ filter(' filter')(' Henry')时,我不希望将其包含在内结果。我只想过滤掉第一级匹配的东西,在这种情况下,' name'和'颜色'属性。
有可能吗?
答案 0 :(得分:2)
您想要创建自定义过滤器,因为Angular提供的默认过滤器似乎会进行深入比较。
以下是我快速提出的一个示例,您可能希望更改过滤器以满足您的需求:
// Looks like a nice little tree :)
app.filter('shallowFilter', function () {
return function (items, value) {
if (!angular.isDefined(value) || value === '') {
return items;
}
return items.filter(function (item) {
for (var prop in item) {
if (item.hasOwnProperty(prop)) {
var propVal = item[prop],
propLower,
valLower;
// Skip values that are not a string..
if (typeof propVal !== 'string') {
continue;
}
propLower = propVal.toLowerCase();
valLower = value.toLowerCase();
if (propLower.indexOf(valLower) !== -1) {
return true;
}
}
}
});
};
});
这里有一个plunker,展示了它是如何运作的。
修改强>
这只会绕过"低水平"对象的属性(浅层搜索),这就是我想要的。
答案 1 :(得分:0)
使用对象表示法:
来自文档: 对象:模式对象可用于过滤数组包含的对象的特定属性。例如{name:" M",phone:" 1"}谓词将返回一个项目数组,其属性名称包含" M"和包含" 1"的财产电话。可以使用特殊属性名称$(如{$:" text"})来接受与对象的任何属性的匹配。这相当于简单子字符串与如上所述的字符串匹配。可以通过在字符串前加上!来取消谓词。例如{name:"!M"}谓词将返回一个项目数组,这些项目的属性名称不包含" M"。
$filter('filter')({ name: 'Henry' });