javascript - 使用 `eval()` 的替代方法 - 过滤产品
问题描述
我目前正在尝试在我的软件中构建一个过滤系统,这就是我下面的内容,正如你所看到的,我正在使用eval()
并且想要一个我不需要使用的解决方案eval()
,有人有什么建议吗?
const items = [{
Product: {
name: 'Hello',
which: 1
},
Finance: {
zero: 0
}
},
{
Product: {
name: 'Hello2',
which: 0
},
Finance: {
zero: 0
}
}];
const filterMenu = [{
name: 'text1',
filterKey: 'Finance.zero == 0',
subText: false
}, {
name: 'text3',
filterKey: 'Product.which == 0',
subText: false
}];
const filteredBy = [0, 1];
const filtered = items.filter(e => eval(filteredBy.map(item => "e." + filterMenu[item].filterKey).join(' && ')));
console.log(filtered);
解决方案
我建议将您的过滤器存储为对象而不是字符串。这样,您可以filterKey
通过every()方法检查每个。
const items = [
{
Product: { name: 'Hello', which: 1 },
Finance: { zero: 0 },
},
{
Product: { name: 'Hello2', which: 0 },
Finance: { zero: 0 },
}];
const filterMenu = [
{
name: 'text1',
filterKey: { group: 'Finance', key: 'zero', value: 0 },
subText: false,
},
{
name: 'text3',
filterKey: { group: 'Product', key: 'which', value: 0 },
subText: false,
}
];
const filtered = items.filter(( item ) => {
return filterMenu.every(( filter ) => {
const { group, key, value } = filter.filterKey;
return item[group][key] === value;
});
});
console.log(filtered);
推荐阅读
- angular - 懒加载模块路由找不到
- prettytable - 如何在漂亮表中的行项目之间添加边界?
- javascript - 如何让滚动条始终在聊天底部
- c# - 如何用星号将项目插入数据库?
- c# - 字符串操作。更改字符串的顺序并删除圆顶字符
- cobol - COBOL - 移动到具有相同名称的变量(已解决)
- c# - 是否可以更改 cefsharp Icontextmenu 上的上下文菜单的颜色?
- hadoop - 是否可以在具有不同架构的镶木地板文件上创建外部配置单元表?
- mysql - Spring Boot JPA MySQL:无法确定合适的驱动程序类
- php - 从 PHP 中的 JQuery POST 检查布尔变量