如何避免重复以下替换代码?

时间:2015-03-09 14:27:54

标签: javascript arrays

这是输入:

[ 'markdown',
  [ 'para', '"a paragraph"' ],
  [ 'hr' ],
  [ 'para', '\'another paragraph\'' ],
  [ 'bulletlist', [ 'listitem', '"a list item"' ] ] ]

以下代码循环遍历数组的每个元素。如果元素是另一个数组,则代码会进一步深入并应用replace,如果不是,则立即应用replace(如果我没有使用if replace语句 for (i = 1; i < tree.length; i++) { var node = tree[i] var x = node.length - 1 var y = node[x].length - 1 if (Array.isArray(node[x])) { node[x] = node[x][y].replace(/"(?=\b)/g, '“') .replace(/"(?!\b)/g, "”") } else { node[x] = node[x].replace(/"(?=\b)/g, '“') .replace(/"(?!\b)/g, "”") } } 数组会导致错误。

replace

困扰我的是与.replace(/"(?=\b)/g, '“').replace(/"(?!\b)/g, "”")的重复。如何修改代码,以便我只执行{{1}}一次?

3 个答案:

答案 0 :(得分:2)

在函数中提取逻辑:

   function replaceMe(element) {
        return element.replace(/"(?=\b)/g, '“')
                      .replace(/"(?!\b)/g, "”");
    }


...
  for (i = 1; i < tree.length; i++) {
    var node = tree[i]
    var x = node.length - 1
    var y = node[x].length - 1

    if (Array.isArray(node[x])) {
      node[x] = replaceMe(node[x][y]);
    } else {
      node[x] = replaceMe(node[x]);
    }
  }
...

答案 1 :(得分:2)

使用迭代,对N维数组有效

function doWork(tree){
  for (i = 1; i < tree.length; i++) {
    var node = tree[i]
    var x = node.length - 1
    var y = node[x].length - 1

    if (Array.isArray(node[x])) {
      doWork(node[x]);
    } else {
      node[x] = node[x].replace(/"(?=\b)/g, '“')
                       .replace(/"(?!\b)/g, "”")
    }
  }
}

// use it
doWork(tree);

答案 2 :(得分:1)

有时候两个简单的正则表达式比一个复合体更快。

但你可以尝试这样的不同方法:

var example_string = '"some_string"',
    regex = /"(.*?)"/g;

var result = example_string.replace(regex, "“$1”");

console.log(result); // “some_string”

```