Tengo una matriz que se pasa a través de un bucle forEach. A continuación, se pasa cada elemento y se comprueba si tiene un orden o caracteres específicos. Si es cierto que los caracteres deben eliminarse de la cadena, entonces se supone que debe volver a repetirse con la nueva cadena. (Cadena antigua menos los caracteres marcados)
Mi problema es el hecho de que todas las funciones todavía contienen localmente la cadena anterior (antes de que se eliminaran los caracteres). ¿Cómo puedo pasar la nueva cadena a las funciones sin restablecer el valor que tiene actualmente "deleteStringData"?
let dnaArray = ["ACATATAGACATACGT","AAAAAATACATAGTAGTCGGGTAG","ATACATCGGGTAGCGT"]; dnaStrand = ""; //SORT THROUGH EACH ITEM IN ARRAY dnaArray.forEach((dnaStrand, index) => { if (findDna(dnaStrand)) { console.log("Case #" + index + " " + dnaStrand + ": YES"); } else { console.log("Case #" + index + " " + dnaStrand + ": NO"); }; }); function findDna(dnaStrand){ if (findHead(dnaStrand)){ if(findBody(dnaStrand)){ console.log("dna"); return true; } } else { return false; } }; function findHead(dnaStrand){ if (findGlobe(dnaStrand)){ if (findEyeSpots(dnaStrand)) { return true; } } else{ return false; } }; function findBody(dnaStrand){ if (findGlobe(dnaStrand) && findLegs(dnaStrand)) { return true; } else { return false; } }; function findGlobe(dnaStrand){ if(findMatch(dnaStrand, /(A+(TAC|CAT)A)/)){ return true; }else{ console.log("No Globe"); } }; function findEyeSpots(dnaStrand){ if(findMatch(dnaStrand, /T(CG*T)*AG/)){ return true; }else{ console.log("No Eyes"); } }; function findLegs(dnaStrand){ if(findMatch(dnaStrand, /CG*T/)){ return true; }else{ console.log("No Legs"); } }; function findMatch (dnaStrand, regex) { dnaStrand = String(dnaStrand); let isMatch = dnaStrand.match(regex); isMatch = String(isMatch[0]); //console.log(isMatch); if (isMatch) { deleteStringData(dnaStrand, isMatch); return true; } else { return false; } }; function deleteStringData (dnaStrand, string) { dnaStrand = dnaStrand.replace(string, ""); };
Lo siento, pero estoy un poco ocupado y no tengo tiempo para leer todo su código. En base a su pregunta, puedo darle una guía básica.
asegúrese de que su función tome un parámetro. Si cada vez que el resultado final no es satisfactorio o simplemente desea repetirlo nuevamente, haga una declaración if, y si va a repetirlo, haga yourFunction(endresult)
adentro. Si le preocupa el retraso, considere convertir su resultado final en una variable global y establecer un setTimeout
para su función.
Si declara las funciones de prueba dentro del ciclo, puede actuar en una sola instancia del hilo en ese ámbito sin necesidad de pasar ninguna referencia.
También puede usar Promesas para encadenar las pruebas.
Este puede no ser el método más eficiente, pero es muy legible.
(async () => { const strands = [ 'ACATATAGACATACGT', 'AAAAAATACATAGTAGTCGGGTAG', 'ATACATCGGGTAGCGT' ]; const results = []; async function analyze(strand, index) { let result = { 'case' : parseInt(index), strand }; function findMatch(pattern) { return new Promise((resolve, reject) => { let m = strand.match(pattern)[0]; if (m) { strand = strand.replace(m, ''); resolve(true); } else { reject(); } }); } function findHead() { return findGlobe().then(findEyes); } function findBody() { return findGlobe().then(findLegs); } function findGlobe() { return findMatch(/(A+(TAC|CAT)A)/); } async function findEyes() { result.eyes = await findMatch(/T(CG*T)*AG/); } async function findLegs() { result.legs = await findMatch(/CG*T/); } function found() { result.dna = true; } function failed() { result.dna = false; } function done() { results.push(result); } await Promise.all([ findHead(), findBody() ]).then(found) .catch(failed) .finally(done); } for (let i in strands) { await analyze(strands[i], i); } console.log(results); })();