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