首页 > 解决方案 > 使用 `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);

标签: javascriptdictionaryfiltereval

解决方案


我建议将您的过滤器存储为对象而不是字符串。这样,您可以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);


推荐阅读