在Javascript中,将一个Array转成一个字符串有toString和join等方法,那么如果给出一个字符串把它转成数组该怎么做呢?例如给出['first', 'second', 'third'],如何将其转成length为3的数组呢?

约束条件

在解决这个问题之前,我们先设定一些条件。

数组元素的分隔符

分隔符可以有多种形式,例如以逗号,来分隔:[a,b,c],然而这种情况下无法在子元素中包含空格。因此以引号和逗号来分隔的方式比较好,如:['a','b','c']["a","b","c"]

在本文中,我们使用单引号'和逗号,作为分隔符:['a','b','c']

健壮性

  • 允许不完整的字符串: 'a','b','c']a','b','c']['a','b','c'['a','b','ca','b','c均可。(即首尾的[]', 可以省略)

  • 允许多余的空格:子元素与逗号之间、首尾元素与方括号之间、字符串首尾部分可以有任意多个空白字符: [ 'a', 'b' , 'c' ] 是合法的

  • 允许最后子元素之后有多余的逗号: ['a','b','c',]是合法的

代码实现

基本思路是使用正则表达式,去除(replace)首部多余的字符,去除(replace)尾部多余的字符,然后按','进行拆分(split

  1. /**
  2. * 将字符串拆分成数组
  3. * @param {String} str - 待拆分的字符串
  4. * @return {Array} 拆分生成的数组
  5. */
  6. function stringToArray (str) {
  7. if (!str || Object.prototype.toString.call(str).toLowerCase().indexOf('string') == -1) {
  8. // 不是String类型,返回空数组
  9. return [];
  10. }
  11. // 去除开头可能存在的多余字符
  12. str = str.replace(/^\s*\[?\s*'?/, '');
  13. // 去除末尾可能存在的多余字符
  14. str = str.replace(/'?\s*,?\s*\]?\s*$/, '');
  15. // split,每个子串之间用逗号分隔,逗号的前后均可以有任意多个空白字符
  16. return str.split(/'\s*,\s*'/);
  17. }

测试

测试数据

  1. var test = [
  2. stringToArray("['first', 'second', 'third']"),
  3. stringToArray("'first', 'second', 'third']"),
  4. stringToArray("first', 'second', 'third']"),
  5. stringToArray("['first', 'second', 'third',]"),
  6. stringToArray("['first', 'second', 'third'"),
  7. stringToArray("['first', 'second', 'third"),
  8. stringToArray("['first' , 'second' , 'third']")
  9. ]

测试结果截图


若有问题,欢迎指正