作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个简单的过滤用户界面。我想使用逻辑 AND 来过滤对象集合,其中对象的匹配取决于任意一组键中每个对象的多个潜在值。要过滤的对象如下所示:
collection = [
{
'Kind': 'Instrument',
'Color': 'Orange',
'Shape': 'Square',
'Name': 'Foobar',
},
...
]
用户的点击式过滤结果如下所示:
filter = {
'Color': ['Red', 'Orange', 'Yellow'],
'Shape': ['Circle']
}
在本例中,我想将集合过滤为以下所有对象:
filter
对象具有任意数量的键,因此我无法轻松编写如下所示的手动过滤器函数:
results = _.filter(collection, item => {
return _.includes(['Red', 'Orange', 'Yellow'], item['Color']) && _.includes(['Circle'], item['Shape'])
})
使用 Lodash 实现此目的最简洁的方法是什么?我是否需要为 _.filter
内的 collection
中的每个项目循环遍历 filter
中的每个键,还是有更好的方法?
附注我没有合适的语言来谈论我想做的事情。描述这个问题的最佳关键字是什么?
最佳答案
你们非常接近:
const collection = [
// Won't be in the output.
{
'Kind': 'Instrument',
'Color': 'Orange',
'Shape': 'Square',
'Name': 'Foobar',
},
// Will be in the output.
{
'Kind': 'Instrument',
'Color': 'Orange',
'Shape': 'Circle',
'Name': 'Foobar',
},
// Won't be in the output.
{
'Kind': 'Derp',
'Color': 'NoWorky',
'Shape': 'HAHAHAHA',
'Name': 'uWin',
}
];
const filter = {
'Color': ['Red', 'Orange', 'Yellow'],
'Shape': ['Circle']
};
const results = _.filter(collection, (item) => {
return _.chain(filter)
.keys()
.reduce((currentBoolean, next) => {
console.log(currentBoolean, next, filter[next], item[next]);
return _.isNil(item[next]) ? currentBoolean : _.includes(filter[next], item[next]) && currentBoolean;
}, true)
.value();
// This doesn't work because you're trying to do arbitrary keys.
// return _.includes(filter.Color, item.Color) && _.includes(filter.Shape, item.Shape));
});
console.log(results);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
关于javascript - 如何使用 Lodash 通过多个潜在属性过滤对象集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49157849/
我是一名优秀的程序员,十分优秀!