Javascript:用字符串创建数组
我想用一个特殊的字符串创建一个数组。格式如下: a、 b,cd,e,fgh,i,j 阵列应如下所示:Javascript:用字符串创建数组,javascript,Javascript,我想用一个特殊的字符串创建一个数组。格式如下: a、 b,cd,e,fgh,i,j 阵列应如下所示: var s = "(a),(b),(c(d,e)),(f(g(h,i,j)))"; var a = s.split("),"); for (var i = 0; i < a.length - 1; i++) a[i] = a[i] + ")"; a | b | cd,e | fgh,i,j 使用函数split不是一个好主意,因为它给了我这样的东西: var s = "(a),(b),
var s = "(a),(b),(c(d,e)),(f(g(h,i,j)))";
var a = s.split("),");
for (var i = 0; i < a.length - 1; i++)
a[i] = a[i] + ")";
a | b | cd,e | fgh,i,j
使用函数split不是一个好主意,因为它给了我这样的东西:
var s = "(a),(b),(c(d,e)),(f(g(h,i,j)))";
var a = s.split("),");
for (var i = 0; i < a.length - 1; i++)
a[i] = a[i] + ")";
a | b | cd | e | fgh | i | j
有什么想法吗?这里有一个可能的简短解决方案:
function strSplit(str, x) {
return x = 0, str.replace(/./g, function(c, i, a) {
return c === "(" ? (x++, c) :
c === ")" && i < a.length - 1 && --x === 0 ? c + "|" : c;
}).split("|,");
}
strSplit("(a),(b),(c(d,e)),(f(g(h,i,j),k(l,m),n))");
// >> ["(a)", "(b)", "(c(d,e))", "(f(g(h,i,j),k(l,m),n))"]
演示:
为了使代码更清晰,以下是全尺寸变量:
function strSplit(str) {
var x = 0;
return str.replace(/./g, function(c, i, a) {
if (c === "(") {
x++;
} else if (c === ")" && i < a.length - 1 && --x === 0) {
return c + "|";
}
return c;
}).split("|,");
}
以下是一个可能的简短解决方案:
function strSplit(str, x) {
return x = 0, str.replace(/./g, function(c, i, a) {
return c === "(" ? (x++, c) :
c === ")" && i < a.length - 1 && --x === 0 ? c + "|" : c;
}).split("|,");
}
strSplit("(a),(b),(c(d,e)),(f(g(h,i,j),k(l,m),n))");
// >> ["(a)", "(b)", "(c(d,e))", "(f(g(h,i,j),k(l,m),n))"]
演示:
为了使代码更清晰,以下是全尺寸变量:
function strSplit(str) {
var x = 0;
return str.replace(/./g, function(c, i, a) {
if (c === "(") {
x++;
} else if (c === ")" && i < a.length - 1 && --x === 0) {
return c + "|";
}
return c;
}).split("|,");
}
大概是这样的:
var s = "(a),(b),(c(d,e)),(f(g(h,i,j)))";
var a = s.split("),");
for (var i = 0; i < a.length - 1; i++)
a[i] = a[i] + ")";
更复杂的结构可能需要:
var s = "(a),(b),(c(d,e)),(f(g(h,i,j),k(l,m),n))";
var a = s.split("),(");
for (var i = 0; i < a.length - 1; i++)
a[i] = a[i] + ")";
for (var i = 1; i < a.length; i++)
a[i] = "(" + a[i];
大概是这样的:
var s = "(a),(b),(c(d,e)),(f(g(h,i,j)))";
var a = s.split("),");
for (var i = 0; i < a.length - 1; i++)
a[i] = a[i] + ")";
更复杂的结构可能需要:
var s = "(a),(b),(c(d,e)),(f(g(h,i,j),k(l,m),n))";
var a = s.split("),(");
for (var i = 0; i < a.length - 1; i++)
a[i] = a[i] + ")";
for (var i = 1; i < a.length; i++)
a[i] = "(" + a[i];
计算开括号的数目怎么样?如果计数为零,则可以安全拆分
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)))"]
计算开括号的数目怎么样?如果计数为零,则可以安全拆分
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)))"]
此函数完全满足您的要求:
function parseStrToArr(str){
var pairs = 0;
var arr = [];
var chars = '';
for(var i = 0, l = str.length; i < l; i++){
var char = str[i];
switch(char){
case '(': pairs++; break;
case ')': pairs--; break;
}
if(!pairs){
if(chars){
arr.push(chars + char);
chars = '';
}
}
else{
chars += char;
}
}
return arr;
}
关键是匹配成对的括号。即使您删除逗号,此算法也会起作用。此函数完全满足您的要求:
function parseStrToArr(str){
var pairs = 0;
var arr = [];
var chars = '';
for(var i = 0, l = str.length; i < l; i++){
var char = str[i];
switch(char){
case '(': pairs++; break;
case ')': pairs--; break;
}
if(!pairs){
if(chars){
arr.push(chars + char);
chars = '';
}
}
else{
chars += char;
}
}
return arr;
}
关键是匹配成对的括号。即使删除逗号,该算法也会起作用。是用管道替换逗号吗?我认为他只是使用管道字符来分隔数组元素,而不是实际将它们添加到字符串中。还是我误解了什么?+1注意,如果OP有a、b、cd之类的东西,它将不起作用,e@WarrenR. 是的,我相信这是真的;OP可以在|之后拆分为+1,这样即使在我的手机上,我也可以不滚动地读取代码。。。请添加一些括号以使其更清楚,但是…这是用管道替换逗号吗?我认为他只是使用管道字符来分隔数组元素,而不是实际将它们添加到字符串中。还是我误解了什么?+1注意,如果OP有a、b、cd之类的东西,它将不起作用,e@WarrenR. 是的,我相信这是真的;OP可以在|之后拆分为+1,这样即使在我的手机上,我也可以不滚动地读取代码。。。请添加一些括号,让它更清楚,不过…我想如果你选择。拆分,它应该会工作。您以前使用过.split吗?在上拆分,然后在除最后一个元素外的所有元素上重新连接如何?@MarouaGasmi字符串是否有可能看起来像a、b、cd、e、f、g,所以是偶数。拆分将失败?或者你认为@WarrenR的评论足够有用,可以作为一个答案吗?你只需要在每个人的工作中捅个洞,是吗@Passerby@Passerby当前位置我们只知道字符串的一种外观。所以答案是关于这一点的。我们不知道绳子的其他样子,为什么要猜测呢?没有给出规则,只有一个例子。这就是我们必须要做的。我想如果你选择。分开,它应该会起作用。您以前使用过.split吗?在上拆分,然后在除最后一个元素外的所有元素上重新连接如何?@MarouaGasmi字符串是否有可能看起来像a、b、cd、e、f、g,所以是偶数。拆分将失败?或者你认为@WarrenR的评论足够有用,可以作为一个答案吗?你只需要在每个人的工作中捅个洞,是吗@Passerby@Passerby当前位置我们只知道字符串的一种外观。所以答案是关于这一点的。我们不知道绳子的其他样子,为什么要猜测呢?没有给出规则,只有一个例子。这就是我们必须要做的。如果a,b,cd,e,fgh,i,j,kl,m,n怎么办?@Passerby:那么拆分必须是,并且连接必须是在所有元素上,除了最后一个和所有元素上,除了第一个。如果a,b,cd,e,fgh,i,j,kl,m,n怎么办?@Passerby:那么拆分必须是,然后,除了最后一个元素外,所有元素都会进行连接,除了第一个元素外,所有元素都会进行连接;var输出=[];var计数=0;var堆栈=[];var c;我刚刚做了一些修改:var lim=input.length;var输出=[];var计数=0;var堆栈=[];var c;