javascript - Angular 服务减法过滤器

标签 javascript angularjs

我有一个 Angular 服务,我正在尝试使用 Javascript 的 Array.prototype.filter() 方法返回过滤后的数据集。我将多个输入对象的 key value 对与另一组对象的 key value 对进行匹配,并返回如果匹配则对象。

这是我的服务:

app.service('scatterService', function(inputService) {
    return function(data) {
        var inputs = inputService.selectedInModel(); // returns 1 - 4 user input objects
        function getSelected(inputs) {
            return data.filter(function(obj) {
                // for each user input that exists
                angular.forEach(inputs, function(val, id) {
                    var dataProp = val['inData'];
                    // if prop value in data = prop value in user input
                    if (obj[dataProp] == val['value']) {
                        // returns objects that have *either* of the user inputs
                        return true;
                    }
                    return false;
                });
            });
        }
        var newData = getSelected(inputs);
        console.log(newData);
    };
});

这将返回一组对象,其中包含具有value“a”或value“b”的属性,但两者之一。我希望它只返回同时具有 a 和 b 值的对象。因此,如果理论上有四个用户输入,则用户选择的每个输入都会越来越缩小数据。或者,仅返回具有所有输入值的项目。

我还希望它能够在功能上过滤最多 4 个潜在输入。

编辑:添加对象结构

inputs: {
    'entertainment': {
        id: 'entertainment',
        inData: 'Ent',
        value: '',
    },
    'TV': {
        id: 'TV',
        inData: 'tv',
        value: '17'
    },
    'Radio': {
        id: 'radio',
        inData: 'radio',
        value: 'JackFM'  
    }
},

数据:300+ 项

data = [
    {
        id: '12345',
        Ent: 30,
        tv: 33
    },
    {
        id: 'TV',
        tv: 17,
        Ent: 999
    }
    // ... and so on
]

最佳答案

专注于您的 Array.prototype.filter 部分:

return data.filter(function(obj) {
    // for each user input that exists
    angular.forEach(inputs, function(val, id) {
        var dataProp = val['inData'];
        // if prop value in data = prop value in user input
        if (obj[dataProp] == val['value']) {
            // returns objects that have *either* of the user inputs
            return true;
        }
        return false;
    });
});

当您找到匹配的属性值时,您将立即返回true - 这会导致obj任何一个时被过滤器选择值匹配。

相反,您可以对每个输入使用 bool AND 运算符来构建结果。当且仅当每个中间输入测试都为 true 时,结果才会为 true。如果任何一个失败,结果将为false

return data.filter(function(obj) {
    // result tracks if this is a matching obj
    // initially assume that it is
    var result = true;

    // for each user input that exists
    angular.forEach(inputs, function(val, id) {
        var dataProp = val['inData'];
        // AND the current result value with this input's test 
        result = result && obj[dataProp] === val['value'];
    });

    // return the resulting chain of ANDs
    return result;
});

关于javascript - Angular 服务减法过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31173191/

相关文章:

javascript - 按钮事件处理

javascript - 简单的 Angular 身份验证

php - 使用 jquery ajax 和 php 实现过滤内容

javascript - Angular 面包屑不起作用

javascript - Angular Js ng-style 条件评估 px

javascript - AngularJS - 单击时调用指令的监听器并将数据传递给它

javascript - 我的 React 组件不会在 Safari 浏览器中更新

javascript - jQuery:无法识别的表达式(解决此错误)

Javascript 表单提交等待完成

javascript - 绑定(bind)对象内部的方法。给出意想不到的结果