如何用javascript将字符串转换成数组

我想把一个类似'["haha", [123, 456, ["haha2"], "hello, this is a test."]]'的字符串转换成数组["haha", [123, 456, ["haha2"], "hello, this is a test."]]。如果把以上例子作为测试的输入,JSON.parse()就可以实现;可是我需要处理的字符串中有一部分是经过ASCII编码的html元素 ("\u003cspan dir\u003d\"ltr\"\u003e\u003cspan class\u003d\"yP\" email\u003d\"haha@gmail.com\"\u003eHa Ha Ha\u003c/span\u003e\u003c/span\u003e"),经过测试如果括号内的字符串存在,那么由字符串向数组的转换就不会成功,如果移除它,那么转换会成功。请问这是为什么,有没有方法能不移除它直接进行转换?
最新回答
安季浅空

2025-02-25 00:34:08

<script type="text/javascript">
var str = '["haha","\u003cspan", [123, 456, ["haha2"], "hello, this is a test."]]';
var objarr = eval(str); //和JSON.parse()的功能一样,生成了数组
alert(objarr[1]);
</script>
执行上面的代码试一下,你会发现他会正常的进行转换,你的代码之所以转换错误,是因为字符串里面有双引号,上面字符串里每一对双引号是括起来了一个值,你这样的字符串加进去就破坏了原来用逗号分类开的一对对的值,造成数组语法错误。所以,去掉双引号就可以了。
var str = '["haha","(\u003cspan dir\u003d\ltr\\u003e\u003cspan class\u003d\yP\ email\u003d\haha@gmail.com\\u003eHa Ha Ha\u003c/span\u003e\u003c/span\u003e)", [123, 456, ["haha2"], "hello, this is a test."]]';
var objarr = eval(str); //和JSON.parse()的功能一样
alert(objarr[1]);
或者在需要用到双引号的地方用单引号代替,单引号前面要加上\,即\‘来代替双引号。
追问
字符串"\u003cspan dir\u003d\"ltr\"\u003e\u003cspan class\u003d\"yP\" email\u003d\"haha@gmail.com\"\u003eHa Ha Ha\u003c/span\u003e\u003c/span\u003e" 中内部的双引号都是  \"  这种形式的,我不知道为什么会产生干扰。而且,这段字符串是一个标准的html文档中的span element,在您的code执行之后span属性的值都没了引号。
追答
var str = "['hana','(\u003cspan dir\u003d\"ltr\"\u003e\u003cspan class\u003d\"yP\" email\u003d\"haha@gmail.com\"\u003eHa Ha Ha\u003c/span\u003e\u003c/span\u003e)']";
var objarr = eval(str); //和JSON.parse()的功能一样
alert(objarr[1]);
这样写。原本你的字符串是用单引号括起了双引号,现在改用双引号括起单引号,这样就没有问题了。
追问
用双引号将单引号括起来后eval()确实可以实现功能,但是JSON.parse()却不行。还有一个问题如果将内部的双引号都改为单引号,程序的执行效率会下降,实际需要处理的字符串可能会是例子的上百倍。
追答
JSON.parse()是你使用的库,eval函数是javascript的原始函数,库具体实现我没研究,要使用的话你自己研究下,或者换用eval函数,出问题的原理是已经搞清楚了,其他的就看你了。
至于执行效率的问题,用单引号和双引号是没有差别的,只是你字符串你需要使用双引号就用单引号括,反之用双引号而已。没有效率的问题。
这不是php,单引号双引号还会区分是要解析还是直接显示。
绾青鸢

2025-02-25 00:40:50

使用unescape试试,对unicode解码。