Javascript 如何确定字符串是否为数组?

Javascript 如何确定字符串是否为数组?,javascript,arrays,regex,string,typescript,Javascript,Arrays,Regex,String,Typescript,给定像“['chad',123,['tankie'],'!!!”]”这样的字符串,,我需要返回一个布尔值,说明该字符串是否为有效数组 我对大多数解决方案持开放态度,包括正则表达式 let strtotest = "['chad', 123, ['tankie'], '!!!']" Array.isArray(eval(strtotest)) 如果数组有效,则返回true。 如果字符串中的语法不正确,它还会抛出一个错误,因此您也必须处理这个问题 我想指出,eval是一个可怕的东西,你永远不应该使

给定像
“['chad',123,['tankie'],'!!!”]”这样的字符串,
,我需要返回一个布尔值,说明该字符串是否为有效数组

我对大多数解决方案持开放态度,包括正则表达式

let strtotest = "['chad', 123, ['tankie'], '!!!']"
Array.isArray(eval(strtotest))
如果数组有效,则返回true。 如果字符串中的语法不正确,它还会抛出一个错误,因此您也必须处理这个问题

我想指出,
eval
是一个可怕的东西,你永远不应该使用它,但是鉴于这个问题的要求是疯狂的,我认为这个解决方案是合适的。

如果你需要支持“任意”字符串,你可以使用
新函数()
作为
eval()
的更安全的替代方案。[]

函数stringIsArray(str){
试一试{
返回新函数(`returnarray.isArray(${str})`)();
}抓住{
返回false;
}
}
控制台日志(stringIsArray(“abc”));

log(stringIsArray(“['chad',123,['tankie','!!!””))假设您希望支持Javascript语法的某个子集,可以使用正则表达式删除空白和标量文本,然后检查剩余的内容是否与嵌套模式相匹配

let remove=[
/\s+/g,
/“(\\.[^'])*”/g,
/“(\\.[^”])*”/g,
/\d+/g,
];
让emptyArray=/\[,*\]/g;
函数stringIsArray(str){
对于(让r移除)
str=str.replace(r',);
如果(str[0]!=='[')
返回false;
while(str.match(emptyArray))
str=str.replace(空数组“”);
返回str.length==0;
}
log(stringIsArray('abc');
log(stringIsArray(`abc',['def',[123456],'ghi',,],]`);
log(stringIsArray(String.raw`
[a“b”c',[d'e'f],
[123, [[   [[["[[[5]]]"]]]]], 456], '\"\'""""',,],,]

`))
您不应该使用eval(出于代码注入的明显原因)。作为JSON解析,我将要做的,当然与数组不同,但它是在不使用
eval()的情况下最接近的

您可以使用
JSON.parse
方法。这里唯一的缺点是,由于JSON的限制,所有字符串都必须用双引号(
)分隔

使用nodejs解释器的快速示例:

> var arrayString = '["chad", 123, ["tankie"], "!!!"]';
undefined
> JSON.parse(arrayString);
[ 'chad', 123, [ 'tankie' ], '!!!' ]
> var notArrayString = 'asdas!asd1{}1239]1[';
undefined
> JSON.parse(notArrayString);
Thrown:
SyntaxError: Unexpected token a in JSON at position 0
> 
然后可以使用
Array.isArray
方法检查它是否为数组

function stringIsArray(str) {
    try {
        return Array.isArray(JSON.parse(str));
    } catch (e) {
        return false;
    }
}

stringIsArray('["chad", 123, ["tankie"], "!!!"]'); // returns true
stringIsArray('something else, not an array'); // returns false

如果你不在乎引号,你可以添加一个
str.replace('\'',“)

也许这对其他人有用,你也可以这样做,并且只需要几行。如果你在'a'中定义了你要分析的字符串

a = "['chad', 123, ['tankie'], '!!!']";
Array.isArray( JSON.parse( a.replace(/'/g,'"') ) );

这将返回真或假

我不寒而栗地说出来,但是
eval()呢
?您给定的字符串实际上不是数组。这需要字符串
chad
以单引号结尾。字符串始终是一个数组-一个字符数组。如果您的意思是内容可以是一个数组,比如JSON数组,那么您需要定义规则,说明是什么将字符串的内容转换为可以被转换的内容解析为一个对象数组。如果只接受有效的JSON(双引号),使用
JSON.parse()
,则会更容易。如果无效,则会抛出错误,您可以捕获该错误以返回false。如果需要接受作为示例提供的输入,
eval()
也很简单,但不安全,这取决于您的用例(例如,
“[alert('P0wned!”)]”“
)。所有项目都应该有基本类型吗?如果是有效的Javascript,您应该能够用双引号替换单引号,并解析为JSON等。
['c“h”ad','1'2'3','t\\\\\'ankie']
etc?@georg我添加了一个替代方案。
新功能
eval
基本上是一样的。不管MDN页面怎么说,它们在安全性和性能上没有区别。当然,两者都解决了OP的直接问题(如果他们足够小心的话)。@georg呃,我相信“基本上是一样的。”“有点夸张(),虽然我同意这两种方法都需要一些前瞻性的考虑,因为它与风险/利用有关。尽管如此,我确实认为像你这样的方法——使用严格的字符串操作——是OP的最佳选择。>但是鉴于这个问题的要求是疯狂的,我认为这个解决方案是合适的。你对这里处理的数据了解多少?Wh你改变答案了吗?这里面有一些很好的元素,比如解析引用的内容。但是,编译时常量文字可能包含的内容超过了一个
\d
所能匹配的内容。示例包括浮点数、指数、符号、数学运算符号、字符串链接等。我猜布尔值也是真/假。@x15:请参阅第二部分答案的第二部分。是的,我明白了。要看国产的东西来做这种事情有点难。@x15:不知道你说的是什么意思,无论如何,谢谢你的输入。