Javascript 带数组的字符串到数组

Javascript 带数组的字符串到数组,javascript,arrays,string,Javascript,Arrays,String,我有那根绳子: str = "['movies', ['The Wind', [7, 'acters', ['Any', 'Roberto']]],['Abc',['acters',['Max', 'Alex', 0.312, false, true]]]]" 正如您所注意到的,str有数字和不带引号的真/假值 有没有一种简单的方法可以将其转换为正确的数组 arr = strToArr(str) arr[1][0][1] // 'Alex' UPD.并且str有像[,,]或像这里的[,],[

我有那根绳子:

str = "['movies', ['The Wind', [7, 'acters', ['Any', 'Roberto']]],['Abc',['acters',['Max', 'Alex', 0.312, false, true]]]]"
正如您所注意到的,str有数字和不带引号的真/假值

有没有一种简单的方法可以将其转换为正确的数组

arr = strToArr(str)
arr[1][0][1] // 'Alex'

UPD.并且str有像[,,]或像这里的[,],[,[,]这样的空元素

UPD2。空元素可以在字符串中的任何位置。它只是带有空元素的普通数组

UPD3.好。我可以使用eval(str),之后我可以像使用数组一样使用它。但这是唯一容易做到的方法吗

var str = ("['movies', ['The Wind', [7, 'acters', ['Any', 'Roberto']]]," + 
       "['Abc',['acters',['Max', 'Alex', 0.312, false, true]]]]").replace(/'/g, '"');

console.log(JSON.parse(str));
将“替换为”并解析为json字符串

附言:为了更好的可读性,我把它分成了两行

pps:如果您有类似
[,
,]
的内容,请将
部分替换为
。替换(/“/g”,”)。替换(/([\[,])\s*([\],])/g,“$1”“$2”)

购买力平价:好的,这是为你的古怪案件

var str = "['movies', ['The Wind', [7, 'acters', ['Any', 'Roberto']]]," + 
         "['Abc',['acters',['Max', 'Alex', 0.312,, false, true,],[,],[,[,],]]]]";

str = fixJson(str.replace(/'/g, '"'));
console.log(JSON.parse(str));

function fixJson(match, m1, m2, m3) {
   if (m1 && m2)
        match = m1 + '""' + m2 + (m3 ? m3 : '');
   return match.replace(/([\[,])\s*([\],])([\s\]\[,]+)?/g, fixJson);   
}
pps#?:我用符号解析器编写了一个符号,但它并不完整:1)它不检查闭包,但您可以计算
[
]
的数量。。。可能是别的什么。。。例如,它会修剪所有引号,但可以通过将
/^[“\s]+|[“\s]+$/g
修改为
/^\s*”|“\s*$/g
来修复

var str = "['movies', ['The Wind', [7, 'acters', ['Any', 'Roberto']]]," + 
     "['Abc',['acters',['Max', 'Alex', 0.312,, false, true,],[,],[,[,],]]],]";

var result = parse(str, 0);
console.log(result);

function parse(str, start)
{
   var i = start, res = new Array(), buffer = '',
       re = /^\s*'|'\s*$/g, quotes = false;

   while(i < str.length) {  // move along the string
       var s = str[i];
       switch(s) {          // check the letter
           case "'":   // if quote is found, set the flag inside of element
             if (buffer.substr(-1) != '\\') // check for escaping
                quotes = !quotes;
             else
                buffer = buffer.substring(0, buffer.length - 1); // remove /
             buffer += s; 
           break;

           case '[':        // opening [ 
              if (!quotes) {   // not inside of a string element
                 ret = parse(str, i + 1); // create subarray recursively
                 i = ret.pos;   // get updated position in the string
                 buffer = null;
                 res.push(ret.ret); // push subarray to results
              } else buffer += s;   // add symbol if inside of a string
           break;

           case ']':               // closing ]
              if (!quotes) {       // not inside of a string
                 if (buffer != null)  // buffer is not empty
                    res.push(buffer.replace(re, "")); // push it to subarray
                 return {ret: res, pos: i}; // return subarray, update position
              }
              buffer += s;  // if inside of a string - add letter
           break;

           case ',':               // comma
              if (!quotes) {       // not inside of a string
                if (buffer != null) // buffer is not empty
                  res.push(buffer.replace(re, "")); // push it to results
                buffer = '';       // clear buffer
                break;
              }

           default: buffer += s; break;  // add current letter to buffer
       }
       i++;
   }
   return res;
}
var str=“['movies',['thewind',[7,'acters',['Any','Roberto']],”+
“['Abc',['acters',['Max',Alex',0.312,,false,true,],[,],[,[,],],],],]”;
var result=parse(str,0);
控制台日志(结果);
函数解析(str,start)
{
var i=start,res=new Array(),buffer='',
re=/^\s*'|'\s*$/g,引号=false;
而(i
如果您将报价单交换为双引号,双引号交换为单引号,如下所示:

var str = '["movies", ["The Wind", [7, "acters", ["Any", "Roberto"]]],["Abc",["acters",["Max", "Alex", 0.312, false, true]]]]'
然后可以使用JSON解析方法(
JSON.parse
在一些本机实现中)


这个字符串是从哪里来的?您应该看看是否可以更改API以提供正确的JSON字符串(使用双引号,而不是单引号)。str有空元素,如[,,78,false,,]@user3331456 replace
by
,“”,
它可以像这里一样[,[,,[,,],]谢谢,但这只是一些可能的情况。我的意思是空元素可以在字符串中的任何地方。这只是一个包含空元素的普通数组。@user3331456请用字符串试试。可以通过symbol生成解析符号str可能包含一个空元素,如['fd',,],false]
var arr = JSON.parse(str);
console.log(arr[1][1][0]); //=> 7