使用点表示法(有时)传递属性以起作用

时间:2016-05-17 14:40:42

标签: javascript angularjs

我有一个正在查看指定集合的​​功能,并突出显示该集合中存在的项目的复选框。

function highlightFiltersPresentInTransactions(collection, collectionproperty, child) {
    var found = false;

    angular.forEach(collection, function (filterType) {
        if (scope.vm.transactions) {
            found = scope.vm.transactions.filter(function (obj) {
                if (child) {
                    return obj[collectionproperty][child] === filterType.name;
                } else {
                    return obj[collectionproperty] === filterType.name;
                }
            });
        }
        if (found) {
            filterType['has-transaction'] = (found.length > 0);
        }
    });
}

我能够调用它并且它正确地像这样工作

highlightFiltersPresentInTransactions(scope.filterTypes, 'target', 'type');
highlightFiltersPresentInTransactions(scope.actionTypes, 'transactionType');

我希望能够避免的是检查是否存在需要检查的子元素。

我试图这样调用函数:

highlightFiltersPresentInTransactions(scope.filterTypes, 'target.type');

由于这是一个字符串,因此无法找到该属性。我还尝试创建一个空白的目标对象,然后传递没有引号的target.type。

如何动态地将可能有或没有子属性的属性传递给我的函数?

1 个答案:

答案 0 :(得分:1)

如何将函数引用传递给函数?

highlightFiltersPresentInTransactions(scope.filterTypes, function(o) { return o.target.type; });
highlightFiltersPresentInTransactions(scope.filterTypes, function(o) { return o.transactionType; });

这很容易实现:

function highlightFiltersPresentInTransactions(collection, readFn) {
    var found = false;

    angular.forEach(collection, function (filterType) {
        if (scope.vm.transactions) {
            found = scope.vm.transactions.filter(function (obj) {
                return readFn(obj) === filterType.name;

            });
        }
        if (found) {
            filterType['has-transaction'] = (found.length > 0);
        }
    });
}

如果您不想这样做,那么您必须将字符串target.type拆分为单独的属性,并以现有方式执行(只是没有显式参数) child)。