Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:用字符串创建数组_Javascript - Fatal编程技术网

Javascript:用字符串创建数组

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),

我想用一个特殊的字符串创建一个数组。格式如下:

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),(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;