如何使用Underscore基于嵌套对象过滤对象数组?

时间:2015-11-24 21:54:15

标签: filter nested underscore.js javascript-objects

我目前正在尝试根据子对象过滤对象数组。该对象的结构如下:

{
    name: 'foo',
    status: 'fail',
    rules: [
        {
            name: 'bar',
            result: 'fail'
        },
        // so on and so forth ~13 rules
    ]
}

我想将结果过滤到rule a status: failrule b status: pass等所有对象。

到目前为止,这就是我所拥有的:

这适用于一个且只有一个参数:

var data = _.filter(this.resultsCollection.toJSON(), function(obj) {
    return _.some(obj.rules, {name:params.rules[0].name});
});

对我来说,这应该有效,而且更符合我的要求,因为_.some只需要一个参数,但不会(只需将其更改为_.where):

var data = _.filter(this.resultsCollection.toJSON(), function(obj) {
    return _.where(obj.rules, {name:params.rules[0].name});
});

我真想要的更像是这样:

var data = _.where(this.resultsCollection.toJSON(), {
    rules: params.rules // params.rules being the array with name and result
});

通过这种方式进行过滤:

var data = _.where(this.resultsCollection.toJSON(), {status:'fail'});

1 个答案:

答案 0 :(得分:0)

使用vanilla javascript过滤器结束。

var data = this.resultsCollection.toJSON().filter(function(obj) {
        for (var i = 0; i < params.rules.length; i++) {
            var rule = params.rules[i];
            for (var k = 0; k < obj.rules.length; k++) {
                if(obj.rules[k].name.toLowerCase() == rule.name.toLowerCase()) {
                    if(obj.rules[k].result.toLowerCase() !== rule.result.toLowerCase()) {
                        return false;
                    } else {
                        break;
                    }
                }
                if(i === obj.rules.length - 1) return false;
            }
        }
        return true;
    });