0

我的应用程序获取一个项目列表,每个项目都有一个状态属性,其值可以是“foo”、“bar”、“blah”等。有时该列表将包含相同的项目,除了一个是 foo 和另一个是酒吧。在这种情况下,我想保留 foos 并丢弃酒吧。

我的过滤器对列表进行了两次传递。在第一次通过时,当遇到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);
    });
};

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

4

2 回答 2

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

像这样的东西应该很接近,可能需要稍微修复一下,但它是一次通过

于 2013-12-04T23:00:14.320 回答
0

似乎reject()一次完成了您需要的一切:

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

_.reject(coll, { state: 'foo' });
// → [ { state: 'bar' }, { state: 'bar' } ]
于 2015-06-09T14:21:51.887 回答