Estoy tratando de replicar lo que hace leetcode, como mi proyecto de aprendizaje React. A continuación se muestra mi configuración de interfaz de usuario actual.
Estoy usando AceEditor como mi editor de texto, ahora mismo puedo leer el valor del editor al cambiar.
Quiero ejecutar la función containsDuplicate cuando hago clic en el botón Run code .
Lo que tengo ahora es una cadena codeValue representa la entrada del usuario en el formato de cadena, y testCase como los parámetros de funciones en el formato de cadena también,
// the codeValue is the complete text in the Ace Editor are const [codeValue, setCodeValue] = useState(''); // The testCase is [1,2,3,1] which reads from the TestCase section const [testCase, setTextCaseValue] = useState(''); const submitHandler = (inputParams) => { console.log(codeValue); }; ¿Qué debo hacer para ejecutar la función containsDuplicate con params testCase ? Suponga que el nombre de la función es siempre containsDuplicate ?
Eval() ejecutará la cadena como función JS, pero lo que necesito es, cuando la cadena es solo una declaración de función y hay varias declaraciones de función, necesito encontrar la función correcta de la cadena y ejecutar esa función con dar entrada.
Digamos que la cadena de entrada es
functionA() { functionB(); } functionB() { } Necesito leer esa cadena y ejecutar functionA([1,2,3,4])
No tengo una buena manera de hacer esto ahora.
¡Gracias!
Si el nombre de la función es fijo*, puede "extraer" la función correcta envolviendo el código de usuario en otra función y simplemente return esa función:
const codeInput = ` function foo() { console.log('foo'); } function containsDuplicate(input) { foo(); console.log('input', input); return 42; } `; const code = new Function(codeInput + '; return containsDuplicate;')() const result = code([1,2,3]); console.log('result', result); También puede agregar lógica adicional que verifique que containsDuplicate Duplicado antes de intentar devolverlo.
Si no quieres dictar el nombre de la función, hay un par de soluciones, más o menos complicadas:
module.exports .eval / new Function ) ( también podría haber soluciones más ligeras para simplemente convertir la sintaxis del módulo ES a, por ejemplo, un IIFE).*: Lo cual es una suposición razonable para hacer IMO. Dado que es un entorno de propósito especial, puede dictar la estructura del código y exigir que haya una función con un nombre específico.