我有一个像这样的数组:
['a 3', 'b', 'c 145', '', 'e', 'f 98', '', 'g 1', 'h', '', 'bla', 'bla']
我想通过在每个“”处拆分来创建列,所以它看起来像这样:
[['a 3', 'b', 'c 145'], ['e', 'f 98'], ['g 1', 'h'], ['bla', 'bla']]
我尝试过各种事情。
你可以做这样简单的事情:
const arr = ['a 3', 'b', 'c 145', '', 'e', 'f 98', '', 'g 1', 'h', '', 'bla', 'bla']
const output = [[]]
arr.forEach(i => {
if(i === ''){
output.push([])
}else{
output[output.length - 1].push(i)
}
})
基本上,如果找到
''
,您只需单步执行并推送到新数组即可。我认为最简单的答案。
小提琴这里
如果你真的想用
reduce
来做,你可以修改它来执行如下操作:
const arr = ['a 3', 'b', 'c 145', '', 'e', 'f 98', '', 'g 1', 'h', '', 'bla', 'bla']
const output = arr.reduce((a, i) => {
if(i === ''){
a.push([])
}else{
a[a.length - 1].push(i)
}
return a
}, [[]])
小提琴这里
var arr = ['a3', 'b', 'c145', '', 'e', 'f98', '', 'g0', 'h', '', 'bla', 'bla'],
array = [];
res = arr.reduce(function(s,a){
if (a != '') {
array.push(a);
} else {
s.push(array);
array = [];
}
return s;
}, []);
!array.length ? null : res.push(array);
console.log(res);
快速解答
//given example
var inital_arr = ['a3', 'b', 'c145', '', 'e', 'f98', '', 'g0', 'h', '', 'bla', 'bla'];
function process_arr(array){
//will be returned once function is complete
var output = [];
//holds array columns until the next ''
var holding_var = [];
//goes through entire array
for(var i = 0; i < array.length; i++){
//runs if string has content
if(array[i].length > 0){
holding_var.push(array[i]);
//runs if string length is 0
} else if(array[i].length <= 0){
//moves the holding array into the output array
output.push(holding_var);
//resets the holding array
holding_var = [];
}
}
return output;
}
//debuging to show it working
console.log(process_arr(inital_arr));
您需要一个外部数组、一个内部数组和一个简单的迭代
function makeArray(arr) {
outer = [];
inner = [];
arr.map(item => {
if (item !== '') {
inner.push(item);
} else {
outer.push(inner);
inner = [];
}
});
return outer;
}
const arr = ['a 3', 'b', 'c 145', '', 'e', 'f 98', '', 'g 1', 'h', '', 'bla', 'bla'];
const res = makeArray(arr);
console.log(res);
这是一种更新的方法,它使用reduce并在每次遇到具有值的元素时启动一个新数组
''
const arr = ['a3', 'b', 'c145', '', 'e', 'f98', '', 'g0', 'h', '', 'bla', 'bla'];
let start = 0;
const out = arr.reduce((p, c, i) => {
const isLast = i === arr.length - 1;
if (c === '' || isLast) {
let end = isLast ? arr.length : i;
p.push(arr.slice(start, end))
start = i+1;
}
return p;
}, []);
console.log(out);