在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','c
、 a','b','c
均可。(即首尾的[
、 ]
、 '
、 ,
可以省略)
允许多余的空格:子元素与逗号之间、首尾元素与方括号之间、字符串首尾部分可以有任意多个空白字符: [ 'a', 'b' , 'c' ]
是合法的
允许最后子元素之后有多余的逗号: ['a','b','c',]
是合法的
基本思路是使用正则表达式,去除(replace
)首部多余的字符,去除(replace
)尾部多余的字符,然后按','
进行拆分(split
)
/**
* 将字符串拆分成数组
* @param {String} str - 待拆分的字符串
* @return {Array} 拆分生成的数组
*/
function stringToArray (str) {
if (!str || Object.prototype.toString.call(str).toLowerCase().indexOf('string') == -1) {
// 不是String类型,返回空数组
return [];
}
// 去除开头可能存在的多余字符
str = str.replace(/^\s*\[?\s*'?/, '');
// 去除末尾可能存在的多余字符
str = str.replace(/'?\s*,?\s*\]?\s*$/, '');
// split,每个子串之间用逗号分隔,逗号的前后均可以有任意多个空白字符
return str.split(/'\s*,\s*'/);
}
var test = [
stringToArray("['first', 'second', 'third']"),
stringToArray("'first', 'second', 'third']"),
stringToArray("first', 'second', 'third']"),
stringToArray("['first', 'second', 'third',]"),
stringToArray("['first', 'second', 'third'"),
stringToArray("['first', 'second', 'third"),
stringToArray("['first' , 'second' , 'third']")
]
若有问题,欢迎指正