将JS逗号分隔的var声明拆分为多个var声明的脚本

时间:2015-12-30 22:57:00

标签: javascript node.js

我有一个很大的代码库,有大量的东西声明如下:

var x = 1,
y = {
     //some object
},
z = function(arg) {
    // some function
};

我想运行一个节点脚本将所有这些转换为

var x = 1;
var y = {
   //some object
};
var z = function(arg) {
   // some function
};

这并不像在它上运行正则表达式那么简单,因为只要出现一个对象或函数,就不能再查找逗号和分号了。

是否有可以为我执行此转换的现有库或工具?不想缩小或丑化代码,我只是想修改现有的,人类可读的代码来摆脱逗号分隔的var声明。

3 个答案:

答案 0 :(得分:1)

是否存在字符序列,后跟identifier然后单个=可以存在于多个var声明之外的情况?我很难想到带有这些字符的字符串文字之外的字符,因为单个=用于分配,我不确定为什么你之前有逗号除了在您尝试替换的初始化表单中之外的赋值语句。

当然,在解析器更合适的情况下使用正则表达式总是有风险的。该模式看起来像:

,\s*([\$a-z_][\$a-z_0-9]*)(?=\s*=[^=])

注意:Visual Studio插件Resharper对此操作进行了重构。但是,与许多其他重构不同,Resharper不提供在全球范围内应用此选项的选项。

答案 1 :(得分:1)

也许我错过了一些东西,但是如果所有逗号分隔符都在一行的末尾,你可以使用正则表达式:

/rules
                {
                /0000
                  {
                  # the globbing pattern to be compared against the url
                  # example: *             -> everything
                  #        : /foo/bar.*    -> only the /foo/bar documents
                  #        : /foo/bar/*    -> all pages below /foo/bar
                  #        : /foo/bar[./]* -> all pages below and /foo/bar itself
                  #        : *.html        -> all .html files
                  /glob "*"
                  /type "allow"
                  }
                }

这是一个浏览器示例:



replace(/,\n/g, ';\nvar ');

// in node, this would come straight from a file
var string = 'var x = 1,\ny = {\n  //some object \n},\nz = function(arg) {\n  // some function\n};';

// heres an element we can use for results
var code = document.getElementById('code');

// lets show original string
code.innerHTML = string;

// lets show the new string in a couple of seconds
setTimeout( function () {
  
  // the regex replace
  var updated = string.replace(/,\n/g, ';\nvar ');

  // updating the code element
  code.innerHTML = updated;
  
  // change color to signify finished
  code.className = 'done';
  
}, 2000);

code {
  
  white-space: pre-wrap;
  white-space: -moz-pre-wrap;
  white-space: -o-pre-wrap;
  word-wrap: break-word;
  
}

.done {
  
  background-color: #C0D9AF;  
  
}




答案 2 :(得分:1)

这似乎可以解决问题:

jsfmt --rewrite" a = b,c = d - > var a = b; var c = d;" input.js> output.js

input.js:

var x = 1,
y = {
     //some object
},
z = function(arg) {
    // some function
};

output.js:

var x = 1;
var y = {
    //some object
  };
var z = function(arg) {
    // some function
  };

使用jsfmt