具有要数组的数组的字符串

String with arrays to array

本文关键字:数组 字符串      更新时间:2023-09-26

我有一个字符串:

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

正如您所注意到的,str有数字和不带引号的true/false值。

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

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

UPDstr有空元素,如[,,,]或类似于此处的[,],[,[,]。

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字符串。

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

pps:如果你有类似[,,],,的东西,用.replace(/'/g, '"').replace(/(['[,])'s*(['],])/g, '$1 "" $2'); 替换.replace部件

ppps:好的,这是你的奇怪情况

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)它不检查闭包,但你可以计算[]的数量2)。。。可能是别的什么。。。就像它修剪所有引号一样,但可以通过将/^["''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", ["The Wind", [7, "acters", ["Any", "Roberto"]]],["Abc",["acters",["Max", "Alex", 0.312, false, true]]]]'

然后您可以使用JSON解析方法(在一些本机实现中为JSON.parse

var arr = JSON.parse(str);
console.log(arr[1][1][0]); //=> 7