使用 `eval()` 的替代方法 - 过滤产品

Alternative for using `eval()` - Filter products

我目前正在尝试在我的软件中构建一个过滤系统,这就是我在下面所拥有的,正如您所看到的,我正在使用 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);

我建议将过滤器存储为对象而不是字符串。这样您就可以通过 every() 方法检查每个 filterKey

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);