如何改进这个两遍JavaScript数据过滤器?

时间:2013-12-04 22:23:54

标签: javascript filter underscore.js lodash

我的应用获取了一个项目列表,每个项目都有一个州属性,其值可以是“foo”,“bar”,“blah”等。有时候列表中的项目是相同的,除了一个是一个foo和另一个是酒吧。在那种情况下,我想保留这些因素并丢弃这些酒吧。

我的过滤器在列表上进行了两次传递。在第一次传递时,当遇到 foo 时,我将一个由“ bar ”加上一个id值组成的字符串推送到黑名单数组。然后在第二遍中,我再次生成密钥并过滤掉黑名单中的任何项目。

var myFilter = function (items) {
    var blacklist = [];

    _.each(items, function (x) {
        if (x.state === 'foo') {
            blacklist.push(['bar', x.id].join(''));
        }
    });

    return _.filter(items, function (x) {
        var key = [x.state, x.id].join('');

        return !_.contains(blacklist, key);
    });
};

这种方法对我来说似乎很丑陋而且效率低下。还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

_.each(items, function (x) {
    if (x.state === 'foo') {
        var key = ['bar', x.id].join('');
        if ( key in items ) {
            delete items[key];
        }
    }       
});

这样的事情应该是接近的,可能需要修复一点但是它的一次传递

答案 1 :(得分:0)

似乎reject()一次性完成了你需要的所有事情:

var coll = [
    { state: 'bar'},
    { state: 'foo' },
    { state: 'bar' },
    { state: 'foo'}
];

_.reject(coll, { state: 'foo' });
// → [ { state: 'bar' }, { state: 'bar' } ]