我的应用获取了一个项目列表,每个项目都有一个州属性,其值可以是“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);
});
};
这种方法对我来说似乎很丑陋而且效率低下。还有更好的方法吗?
答案 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' } ]