作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个我想要转换的代码模块
for (var key in foo){}
进入
for (var keys = 0; key < foo; key++){}
到目前为止我做到了:
return j(file.source)
.find(j.ForInStatement)
.replaceWith(p => {
var prop = p.node.left.declarations[0].id;
var v = [j.variableDeclarator(prop, null)];
var varDec = j.variableDeclaration('var', v);
var binary = j.binaryExpression('<', prop, j.identifier('foo'));
var uE = j.updateExpression('++', prop, false);
var block = j.blockStatement([]);
var forIn = j.forStatement(varDec, binary, uE, block);
return forIn;
})
.toSource();
for (var key; key < foo; key++)
{}
我仍然对从头开始创建东西感到有点迷失......
问题:
foo.length
...PS: Felix ,如果您正在阅读本文,请指出我可以在哪里发送拉取请求以改进文档!我很乐意在我尝试学习此 API 时提供帮助。哦,还有菲利克斯,你们制作的工具真是太棒了!
最佳答案
直接创建 AST 节点确实很冗长。然而,jscodeshift 导出了一些帮助器“方法”,允许您从字符串生成 AST 节点,并让您插入现有的 AST 节点(带标签的模板!)。
上面的例子可以简化为:
return j(file.source)
.find(j.ForInStatement)
.replaceWith(p => {
var prop = p.node.left.declarations[0].id;
return statement`for (var ${prop} = 0; ${prop} < foo.length; ${prop}++) ${p.node.body}`;
})
.toSource();
请注意,这些模板方法(表达式
、语句
、语句
)有其局限性(您只能在可以插入的地方插入 AST 节点)输入标识符)。
如果您想手动创建 foo.length
,则必须创建 MemberExpression
:
j.memberExpression(
prop,
j.identifier('length')
);
关于javascript - codemod 从 ForInStatement 到 ForStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37577945/
我有一个我想要转换的代码模块 for (var key in foo){} 进入 for (var keys = 0; key { var prop = p.node.left.de
我是一名优秀的程序员,十分优秀!