es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

jscodeshift convierte el forEach a un bucle for

Soy nuevo en jscodeshift y AST, pero estoy intentando convertir mis bucles forEach existentes en bucles for normales.

Quiero convertir el siguiente código:

[
    `foo`,
    `bar`
].forEach(test => {
    console.log(test);
});

A esto:

for(const test of  [`foo`, `bar`]) {
  console.log(test);
}
export default (file, api) => {
  const j = api.jscodeshift;
  const root = j(file.source);

  // ¿Qué debo hacer aquí para transformar el bucle forEach en un bucle for normal?

  return root.toSource();
};

He estado buscando en la documentación y haciendo algunas búsquedas, pero no puedo encontrar una manera de hacer esto.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para convertir el bucle forEach existente en un bucle for regular, puedes usar el método ‘replaceWith’ de ‘jscodeshift’ para reemplazar la expresión de llamada forEach con una nueva declaración de bucle for.

    Aquí tienes el código actualizado:

    export default (file, api) => {
      const j = api.jscodeshift;
      const root = j(file.source);
    
      // Encuentra todas las expresiones de matriz con llamadas forEach
      const arrayForEachExpressions = root
        .find(j.ArrayExpression)
        .filter(path =>
          path.parentPath.value.type === 'CallExpression' &&
          path.parentPath.value.callee.property.name === 'forEach'
        );
    
      // Reemplaza cada llamada forEach con un bucle for
      arrayForEachExpressions.forEach(path => {
        const arrayNode = path.node;
        const callbackNode = path.parentPath.value.arguments[0];
        const forLoopNode = j.forOfStatement(
          j.variableDeclaration('const', [
            j.variableDeclarator(
              j.identifier(callbackNode.params[0].name),
              arrayNode
            )
          ]),
          callbackNode.body
        );
        j(path.parentPath).replaceWith(forLoopNode);
      });
    
      return root.toSource();
    };
    

    Explicación:

    1. Primero, encontramos todos los nodos ArrayExpression en el árbol de sintaxis abstracta (AST).
    2. Luego, filtramos solo las expresiones que están dentro de una CallExpression con la propiedad forEach para asegurarnos de que solo estamos apuntando a las expresiones de matriz forEach relevantes.
    3. Para cada una de estas expresiones, extraemos el nodo de la matriz y el nodo de devolución de llamada (el primer argumento del método forEach).
    4. Creamos un nuevo nodo forOfStatement utilizando jscodeshift que utiliza el nodo de la matriz como iterable y el cuerpo del nodo de devolución de llamada como cuerpo del bucle.
    5. Por último, utilizamos el método replaceWith para reemplazar la expresión de llamada forEach original con la nueva declaración de bucle for.

    Ten en cuenta que estamos asumiendo que el método forEach siempre se llama en un nodo ArrayExpression. Si tu código utiliza forEach en otros tipos de nodos, es posible que debas ajustar la condición del filtro en consecuencia.

Comments are closed.