我的应用程序获取一个项目列表,每个项目都有一个状态属性,其值可以是“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);
});
};
这种方法对我来说似乎很丑陋且效率低下。有没有更好的办法?