Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

241
Views
La función declarada en un bucle contiene referencias no seguras a variable(s) ESLint

Tengo la siguiente función que toma tanto un objeto como una palabra y devuelve un objeto reemplazando todas las apariciones de la palabra pasada por otra cadena. La misma función contará el número de veces que se ha reemplazado la palabra y la incluirá en la cadena reemplazada.

Por ejemplo, considere lo siguiente:

 let noOfReplacements = 0; const reg = new RegExp(`\\bplease\\b`, "gi"); const data = [ { name: "please, I said please", title: "Test One", more: [ { name: "another name", title: "please write something. I said please." } ] }, { name: "testTwo", title: "Test Two" }, { name: "testThree", title: "Test Three" }, { name: "testFour", title: "Test Four" } ]; const replace = (obj, reg) => { for (const key in obj) { if (typeof obj[key] === "object" && obj[key] !== null) { replace(obj[key], reg); } else if (key === "title") { obj[key] = obj[key].replace(reg, function () { noOfReplacements += 1; return `repalced${noOfReplacements}`; }); } } return obj; }; const result = replace(data, reg) console.log("number of replacements", noOfReplacements); console.log("result", result);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Esto funciona bien. Sin embargo, recibo una advertencia de ESlint:

 Function declared in a loop contains unsafe references to variable(s) 'noOfReplacements'

¿Cómo puedo actualizar de forma segura noOfReplacements en este caso?

He visto este ejemplo , pero el problema con esa solución es que no considera oraciones separadas y palabras reemplazadas por separado. Entonces, en el ejemplo anterior, aunque reemplazará con éxito todas las palabras, solo aumentará el conteo en 1 ya que ambas palabras están en la misma propiedad. Por lo tanto, noOfReplacements permanece en 1 cuando debería ser 2.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Simplemente puede seguir el título de la regla ( no-loop-func ) y declarar su función fuera del ciclo y luego llamarla en el ciclo.

 const replace = (object, reg) => { const incrementAndReplace = () => { noOfReplacements += 1; return `repalced${noOfReplacements}`; }; for (const key in object) { if (typeof object[key] === 'object' && object[key] !== null) { replace(object[key], reg); } else if (key === 'title') { object[key] = object[key].replace(reg, incrementAndReplace); } } return object; }; 

 let noOfReplacements = 0; const reg = /\bplease\b/gi; const data = [ { name: 'please, I said please', title: 'Test One', more: [ { name: 'another name', title: 'please write something. I said please.', }, ], }, {name: 'testTwo', title: 'Test Two'}, {name: 'testThree', title: 'Test Three'}, {name: 'testFour', title: 'please Test Four'}, ]; const replace = (object, reg) => { const incrementAndReplace = () => { noOfReplacements += 1; return `repalced${noOfReplacements}`; }; for (const key in object) { if (typeof object[key] === 'object' && object[key] !== null) { replace(object[key], reg); } else if (key === 'title') { object[key] = object[key].replace(reg, incrementAndReplace); } } return object; }; replace(data, reg); console.log('number of replacements', noOfReplacements); console.log('result', data);

about 4 years ago · Juan Pablo Isaza Report

0

De todos modos, siempre elegiría un enfoque en el que la función de reemplazo implementada recursivamente, específica del título, sea independiente de cualquier ámbito externo. En su lugar, se ejecutaría dentro del contexto de una referencia enlazada que presenta, por ejemplo, una propiedad replacementCount que se rastreará internamente. La actualización está a cargo de una devolución de llamada de reemplazo.

La siguiente implementación recursiva proporcionada también presenta iteraciones específicas de elementos Array y entradas de Object para procesar solo las propiedades propias de un objeto, a diferencia del bucle for...in del OP, que también itera las propiedades prototípicas.

 function recursivelyReplaceTitleAndTrackBoundCount(data, regX) { let { replacementCount: count } = this; const boundRecursiveReplacer = recursivelyReplaceTitleAndTrackBoundCount.bind(this); const getTrackedCount = (/*match*/) => `repalced_${ ++count }`; if (Array.isArray(data)) { data.forEach(dataItem => boundRecursiveReplacer(dataItem, regX) ); } else { Object .entries(data) .forEach(([key, value]) => { if (value && (typeof value === 'object')) { boundRecursiveReplacer(value, regX); } else if ((key === 'title') && regX.test(value)) { data[key] = value.replace(regX, getTrackedCount); this.replacementCount = count; } }); } } const data = [{ name: "please, I said please", title: "Test One", more: [{ name: "another name", title: "please write something. I said please.", }], }, { name: "testTwo", title: "Test Two", even: { some: { more: { name: "another name", title: "please write something. I said please.", }, }, }, }, { name: "testThree", title: "Test Three", }, { name: "testFour", title: "Test Four, if you ...please?", }]; const tracker = { replacementCount: 0 }; recursivelyReplaceTitleAndTrackBoundCount .call(tracker, data, /\bplease\b/gi); const { replacementCount } = tracker; console.log({ data, replacementCount });
 .as-console-wrapper { min-height: 100%!important; top: 0; }

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!