Javascript:从字符串创建数组

标签 javascript

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

(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)))"] 

http://jsbin.com/otofog/1/


或者(如果您的目标不是 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)))') );

http://jsbin.com/ohasuc/1/

关于Javascript:从字符串创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435031/

相关文章:

javascript - 识别 css 创建的列并使用 javascript 添加额外的列

javascript - 从查询字符串中查找 USSD 代码

javascript - JavaScript中 "!"中的 `state = !state;`是什么意思

javascript - 从sql行数组到js函数

javascript - 从剑道网格内的剑道颜色选择器更新服务器

javascript - jQuery 在页面任意位置单击时向后滑动

javascript - 无法读取 Object.keys 内未定义的属性 'setState',使用react

javascript - 指定 ZeroClipboard.swf 的路径,Laravel + jQuery

javascript - 为什么div(s)在PopUp中不起来?

javascript - 将 PHP 变量传递给 jQuery 时遇到问题