我有一个看起来像这样的字符串:
str = {1|2|3|4|5}{a|b|c|d|e}
我想将它拆分成多个数组。一个包含每个{}中的所有第一个元素,一个包含第二个元素,等等。像这样:
arr_0 = [1,a]
arr_1 = [2,b]
arr_2 = [3,c]
.....
我能想到的最好的是:
var str_array = str.split(/}{/);
for(var i = 0; i < str_array.length; i++){
var str_row = str_array[i];
var str_row_array = str_row.split('|');
arr_0.push(str_row_array[0]);
arr_1.push(str_row_array[1]);
arr_2.push(str_row_array[2]);
arr_3.push(str_row_array[3]);
arr_4.push(str_row_array[4]);
}
有没有更好的方法来实现这一目标?
答案 0 :(得分:3)
尝试以下方法:
var zip = function(xs, ys) {
var out = []
for (var i = 0; i < xs.length; i++) {
out[i] = [xs[i], ys[i]]
}
return out
}
var res = str
.split(/\{|\}/) // ['', '1|2|3|4|5', '', 'a|b|c|d|e', '']
.filter(Boolean) // ['1|2|3|4|5', 'a|b|c|d|e']
.map(function(x){return x.split('|')}) // [['1','2','3','4','5'], ['a','b','c','d','e']]
.reduce(zip)
/*^
[['1','a'],
['2','b'],
['3','c'],
['4','d'],
['5','e']]
*/
答案 1 :(得分:1)
var str = '{1|2|3|4|5}{a|b|c|d|e}'.match(/[^{}]+/g).map(function(a) {
return a.match(/[^|]+/g);
}),
i,
result = {};
for (i = 0; i < str[0].length; i += 1) {
result["arr_" + i] = [+str[0][i], str[1][i]];
}
第一部分,取出字符串,并将其分成两半。在|
之后将地图拆分后,地图将返回一个数组。所以str
等于:
[
[1,2,3,4,5],
['a', 'b', 'c', 'd', 'e']
]
for循环将迭代[1,2,3,4,5]
数组并使用适当的值生成数组。数组存储在一个对象中。我们使用的对象称为result
。如果您不希望将其保留在result
中,请阅读Other
因为您无法从其他变量创建变量名称,所以可以随时将result
更改为window
,或者甚至更改this
(我不会知道这是否有效你也可以把它变成一个数组
var str = '{1|2|3|4|5}{a|b|c|d|e}'.match(/[^{}]+/g).map(function(a) { return a.match(/[^|]+/g); }),
result = [];
for (var i = 0; i < str[0].length; i += 1) {
result[i] = [+str[0][i], str[1][i]];
}
这非常相似,除非生成包含其他答案的Array
数组,