Estoy aprendiendo JS. De repente, obtuve el siguiente problema de Internet y me interesé en resolverlo. Pero me estoy confundiendo, ¿cómo puedo hacer esto? ¿Necesito usar split?
El problema es usar JS, convertir:
[ "AND", ["<", "var1", "var2"], [ "OR", [">", "var3", "var4"], ["==", "var5", "var6"] ] } To: "var1 < val2 AND (var3 > val4 OR val5 == val6)"¿Alguien puede darme alguna idea? Gracias
Primero construiría un objeto cuyas claves son las cadenas de operador y cuyos valores son devoluciones de llamada que, cuando se llaman, producen el resultado de comparación apropiado.
Para evitar las variables eval y globales, no use nombres de variables separados, sino póngalos todos en un objeto, de modo que pueda usar la notación de corchetes para buscar dinámicamente la propiedad apropiada en el objeto.
Si cualquiera de los operadores es una matriz, use la recursividad para evaluar primero esos valores internos. De lo contrario, puede usar la cadena de operador para buscar la función para llamar y llamarla.
const constants = { var1: 1, var2: 2, var3: 3, var4: 4, var5: 5, var6: 6, }; const operations = { AND: (x, y) => x && y, OR: (x, y) => x || y, '<': (x, y) => x < y, '>': (x, y) => x > y, '==': (x, y) => x == y, }; const input = [ "AND", ["<", "var1", "var2"], [ "OR", [">", "var3", "var4"], ["==", "var5", "var6"] ] ]; const evaluate = ([operator, val1, val2]) => { val1 = (Array.isArray(val1)) ? evaluate(val1) : constants[val1]; val2 = (Array.isArray(val2)) ? evaluate(val2) : constants[val2]; return operations[operator](val1, val2); }; console.log(evaluate(input)); const constants = { var1: 1, var2: 2, var3: 10, var4: 4, var5: 5, var6: 6, }; const operations = { AND: (x, y) => x && y, OR: (x, y) => x || y, '<': (x, y) => x < y, '>': (x, y) => x > y, '==': (x, y) => x == y, }; const input = [ "AND", ["<", "var1", "var2"], [ "OR", [">", "var3", "var4"], ["==", "var5", "var6"] ] ]; const evaluate = ([operator, val1, val2]) => { val1 = (Array.isArray(val1)) ? evaluate(val1) : constants[val1]; val2 = (Array.isArray(val2)) ? evaluate(val2) : constants[val2]; return operations[operator](val1, val2); }; console.log(evaluate(input));Si desea convertir una matriz en una cadena, tal vez funcione alguna función recursiva.
Supongo que ha dado una matriz donde el primer elemento es la condición y los 2 restantes son las variables en las que desea colocarlo.
var payload = [ 'AND', ['<', 'var1', 'var2'], ['OR', ['>', 'var3', 'var4'], ['==', 'var5', 'var6']], ] function convertFunction(array) { const condition = array[0]; let LHS = array[1]; let RHS = array[2]; if(Array.isArray(LHS)){ LHS = convertFunction(LHS); } if(Array.isArray(RHS)){ RHS = `(${convertFunction(RHS)})`; } return `${LHS} ${condition} ${RHS}` } console.log(convertFunction(payload));No estoy seguro si se usa el algoritmo correcto para determinar si se necesitan corchetes.
const input = [ "AND", ["<", "var1", "var2"], [ "OR", [">", "var3", "var4"], ["==", "var5", "var6"] ] ]; const strArr = (arr) => { const printSide = (side) => Array.isArray(side) ? printBrackets(side) : side; const printBrackets = (side) => Array.isArray(side[1]) && Array.isArray(side[2]) ? `(${strArr(side)})` : strArr(side); const [operator, left, right] = arr; return [printSide(left), operator, printSide(right)].join(' '); }; console.log(strArr(input)); .as-console-wrapper{min-height: 100%!important; top: 0}