首先,您分别处理数组元素并提取它们的标记。然后合并结果。
您正在寻找 3 种类型的令牌:
- 一个“a”。其正则表达式是
/a/。
- 一系列其他字符 =>
/[^a]+/
- 当原始元素是一个空字符串时,你想保留它 =>
/^$/
因此,令牌的正则表达式总共是 /a|[^a]+|^$/。要提取 所有 标记,您需要包含全局搜索标志 g。
var strings = ['dcab', 'feac', 'gwad', 'dnae'];
var arrays = strings.map(function(string) {
return string.match(/[^a]+|a|^$/g);
});
match 返回一个数组,其中包含在字符串中找到的标记。剩下要做的就是连接所有这些数组。
幸运的是,有一个数组方法仅用于此特定目的。但不幸的是,使用未知数量的数组并不容易:
var tokens = arrays[0].concat(arrays[1], arrays[2], ...
首先你不知道你有多少个数组。所以没有办法传递正确数量的参数。但也许你甚至不知道array[0] 是否存在。所以你最好使用一个空数组作为起点。
不过有办法解决这个问题。
一种解决方案是将串联分成多个步骤:
var tokens = arrays.reduce(function(result, array) {
return result.concat(array);
}, []); // note the initial empty array
但对我来说,使用apply 并一次传递所有数组似乎更合适:
var concat = Array.prototype.concat;
var tokens = concat.apply([], arrays);
所有放在一起的代码如下所示:
var strings = ['dcab', 'feac', 'gwad', 'dnae'];
var concat = Array.prototype.concat;
var tokens = concat.apply([], strings.map(function(string) {
return string.match(/[^a]+|a|^$/g);
}));