将嵌套数组拆分为多个数组

时间:2015-04-08 00:51:48

标签: javascript

我有一个看起来像这样的字符串:

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]);
}

有没有更好的方法来实现这一目标?

2 个答案:

答案 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数组,