-1

我是 jscodeshift 和 AST 的新手,但我正在尝试对现有的 forEach 循环进行转换并将它们转换为常规的 for 循环。

我想隐藏以下内容:

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

对此:

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

  // What do I do here to transform the forEach to a regular for loop?

  return root.toSource();
};

我一直在浏览一些文档并进行搜索,但我找不到这样做的方法。

4

1 回答 1

0

这就是我一直在寻找的。

root.find(j.CallExpression, {
    callee : {
        property : {
            name : "forEach"
        }
    }
})
.replaceWith(path => {
    // Hangles foo.forEach() and [1,2].forEach()
    const expression = path.value.callee.object.name ? j.identifier(path.value.callee.object.name) : j.arrayExpression(path.value.callee.object.elements);

    return j.forOfStatement(
      j.variableDeclaration(
            "const",
            path.value.arguments[0].params
      ),
      expression,
      path.value.arguments[0].body
    )
});
于 2021-12-15T20:04:58.567 回答