0

假设我有一个数组['dcab', 'feac', 'gwad', 'dnae'],但想让每个数组'a'都在自己的令牌中,例如['dc', 'a', 'b', 'fe', 'a', 'c', 'gw', 'a', 'd', 'dn', 'a', 'e'];. 我该怎么做?谢谢!

4

4 回答 4

7
var x = ['dcab', 'feac', 'gwad', 'dnae'];
x = x.join('-').replace(/a/g,"-a-").split('-');

更新:正如@Robert 指出的那样,如果您'a'在开头或结尾有,这将导致''空白字符串出现在最终数组中。您可以通过执行以下操作来删除空白字符串来解决此问题:

x.join('-').replace(/a/g,"-a-").split('-').filter(function(x) { return x!='' });

或者,对于性能可能成为问题的较大数组,您可以简单地使用另一个分隔符摆脱额外的分隔符.replace()(这可能是更好的方法,尽管它不那么可读):

x.join('-').replace(/a/g,"-a-").replace(/^\-|\-(?=\-)|\-$/g,'').split('-');

当然,不用说你的分隔符可以是任何东西(它不一定是 a '-'),只要你能保证它不会出现在你的任何字符串中。

于 2012-08-10T22:41:08.480 回答
4
var arr = ['dcab', 'feac', 'gwad', 'dnae'];
var result = [];
var i;
var s;

for (i = 0; i < arr.length; i++) {
    s = arr[i].split('a');
    result.push(s[0]);
    if (s.length > 1) {
        result.push('a');
        result.push(s[1]);
    }
}

仅当每个字符串恰好包含一个或零个“a”字符时才有效。如果它可以包含更多,您可以遍历 split 的结果。

于 2012-08-10T22:36:43.933 回答
3
var arr = ['dcab', 'feac', 'gwad', 'dnae'];

var new_arr = arr.reduce(function(ret, val) {
    ret.push.apply(ret, val.split(/(a)/))
    return ret;
}, []);

请注意,某些较旧的浏览器不支持捕获和保留拆分字符。


像这样简洁一点...

var new_arr = arr.reduce(function(ret, val) {
    return ret.concat(val.split(/(a)/));
}, []);
于 2012-08-10T22:38:23.270 回答
0

首先,您分别处理数组元素并提取它们的标记。然后你结合结果。

您正在寻找 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);
}));
于 2014-08-28T05:18:22.690 回答