通过自定义筛选器中的点表示法访问数据对象属性

时间:2016-02-14 05:06:42

标签: angularjs angularjs-filter

我有一个包含products数组的数据对象。

$scope.data = {
products: [
{ name: "Product #1", description: "A product",
category: "Category #1", price: 100 },
{ name: "Product #2", description: "A product",
category: "Category #1", price: 110 },
{ name: "Product #3", description: "A product",
category: "Category #2", price: 210 },
{ name: "Product #4", description: "A product",
category: "Category #3", price: 202 }]
};

然后我有一个自定义过滤器和一个' for'我可以通过data[i][propertyName]而不是data[i].propertName来获取类别属性值。任何人都可以解释原因吗?

我正在通过我的ng-repeat作为集合传递data.products,然后对其应用过滤器说unique: 'category'



<a ng-repeat="item in data.products | orderBy: 'category' | unique: 'category' " ></a>
&#13;
&#13;
&#13;

我的过滤器

angular.module('customFilters', [])
.filter('unique', function(){

return function(data, propertyName){
    if(angular.isArray(data) && angular.isString(propertyName)) {
        var results = [];
        var keys = {};
        for(var i = 0; i < data.length; i++){
            var val = data[i][propertyName];
            if(angular.isUndefined(keys[val])){
                keys[val] = true;
                results.push(val);
            }
        }

        return results; 
    } else {
        return data;
    }
}
});

我的理解是当我到达data[i]时,我得到一个{'name' : 'blah', 'category': 'category1'...}的项目,它是一个对象。所以我也可以通过data[i].propertyName访问点符号来获取值! 请帮助/纠正/验证我的理解!

2 个答案:

答案 0 :(得分:1)

data[i].propertyName获取您对象所没有的propertyName属性。点符号不能(通常)用于访问存储在变量中的属性名称,您应该使用data[i][propertyName]或其他元编程方法,如Reflect.get。此外,data[i].propertName还有一个拼写错误。

答案 1 :(得分:1)

当您执行data[i].propertyName时,它会使用 propertyName 而不是变量propertyName的值来获取值。

由于您需要在变量propertyName中获取密钥库,因此您应该坚持使用Bracket表示法