0

我有个问题...

我有一个由用户输入的字符串,看起来像这样

let conditions = "id === 101 || name === 'Albert' && age !== 43"

我还有一个数据数组,该数组也是用户在之前的某个时间点创建的。数据以数组的形式存储,看起来像这样,用户现在已经请求了与他给出的条件相匹配的所有数据条目。

let data = [
    {id:101, name:"Albert", age:63},
    {id:102, name:"Einstein", age:53}
]

您可能会看到我的目标。要返回的数组应如下所示。

let returnedArray = [
    {id:101, name:"Albert", age:63}
]

现在,我的第一个想法就是使用 eval。使用 eval 和 for 循环创建变量,使用 eval 进行检查等等。

但这会很慢,而且似乎是多余的。另外,我们不能再用 eval 声明变量,创建这么多全局变量对我的项目是非常有害的。

条件或数据数组都不是静态的。条件是用户输入的,数据数组不仅在不断变化,而且也是用户创建的。

有什么建议么?

4

1 回答 1

3

使用 eval 将是最简单的方法,无需创建大量全局变量。我们可以使用过滤器,并将每个对象解构为恰好匹配条件逻辑的属性。

let conditions = "id === 001 || name === 'Albert' && age !== 43"

let data = [
    {id:001, name:"Albert", age:63},
    {id:002, name:"Einstein", age:53}
]

let output = data.filter(({id, name, age}) => eval(conditions));

console.log(output);

另一种可能性是更改条件的结构,使其成为代码而不是字符串,从而消除使用 eval 的危险:

let conditions = ({id, name, age}) => {
  return id === 001 || name === 'Albert' && age !== 43;
};

let data = [
    {id:001, name:"Albert", age:63},
    {id:002, name:"Einstein", age:53}
]

let output = data.filter(conditions);

console.log(output);

于 2022-01-14T16:15:54.877 回答