我想用一个特殊的字符串创建一个数组。格式如下:
(a),(b),(c(d,e)),(f(g(h,i,j)))
数组应该是这样的:
(a) | (b) | (c(d,e)) | (f(g(h,i,j)))
使用 split()
函数不是一个好主意,因为它给了我这样的东西:
(a) | (b) | (c(d | e)) | (f(g(h | i | j)))
有什么想法吗?
最佳答案
如何计算打开括号的数量?如果计数为零,则可以安全拆分。
var
input = '(a),(b),(c(d,e)),(f(g(h,i,j)))',
i = 0,
lim = input.length,
output = [],
count = 0,
stack = [],
c;
for (; i < lim; i += 1) {
c = input.charAt(i);
switch (c) {
case '(':
count += 1;
break;
case ')':
count -= 1;
break;
case ',':
if (count === 0) {
output.push(stack.join(''));
stack = [];
continue;
}
break;
}
stack.push(c);
}
if (stack.length > 0) {
output.push(stack.join(''));
}
console.log(output); // ["(a)", "(b)", "(c(d,e))", "(f(g(h,i,j)))"]
或者(如果您的目标不是 IE < 9):
function mySplit(input) {
var count = 0, output = [], stack;
stack = input.split('').reduce(function (stack, c) {
switch (c) {
case '(': count += 1; break;
case ')': count -= 1; break;
case ',':
if (count === 0) {
output.push(stack.join(''));
return [];
}
}
stack.push(c);
return stack;
}, []);
if (stack.length > 0) {
output.push(stack.join(''));
}
return output;
}
console.log( mySplit('(a),(b),(c(d,e)),(f(g(h,i,j)))') );
关于Javascript:从字符串创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435031/