Tengo un problema...
Tengo una cadena ingresada por el usuario y se parece a esto
let conditions = "id === 101 || name === 'Albert' && age !== 43"
También tengo una matriz de datos que también fue creada por el usuario en algún momento anterior. Los datos se almacenaron en forma de una matriz que se ve así, y el usuario ahora ha solicitado todas las entradas de datos que coinciden con las condiciones que ha dado.
let data = [ {id:101, name:"Albert", age:63}, {id:102, name:"Einstein", age:53} ]
Probablemente puedas ver a dónde voy con esto. La matriz que se devolverá debería tener este aspecto.
let returnedArray = [ {id:101, name:"Albert", age:63} ]
Ahora, mi primer pensamiento fue solo usar eval. Creando las variables con eval y for loop, verificando con eval y así sucesivamente.
Pero eso sería muy lento y parece redundante. Además, ya no podemos declarar variables con eval, y crear tantas variables globales sería muy perjudicial para mi proyecto.
Ni las condiciones ni la matriz de datos son estáticas. Las condiciones son ingresadas por el usuario y las matrices de datos no solo cambian constantemente, sino que también son creadas por el usuario.
¿Alguna sugerencia?
Usar eval sería la forma más sencilla, no hay necesidad de crear un montón de variables globales. Podemos usar el filtro y desestructurar cada objeto en sus propiedades que coincidan con la lógica de la condición.
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);
Otra posibilidad es cambiar la estructura de las condiciones para que sea código en lugar de cadenas, eliminando los peligros de usar 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);