Angularjs仅过滤第一级属性

时间:2014-10-24 18:42:19

标签: javascript angularjs

我有javascript对象,如下所示:

{ name: 'Barney', color: 'blue', parent: {name: 'Henry'} }

当我在包含上述对象的数组上使用$ filter(' filter')(' Henry')时,我不希望将其包含在内结果。我只想过滤掉第一级匹配的东西,在这种情况下,' name'和'颜色'属性。

有可能吗?

2 个答案:

答案 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' });