我有一些参数,这些参数将由用户传递给命令。命令的每个参数将用一个空格分隔,这将表示一个新的参数。示例:"arg1 arg2 arg3"
转换为["arg1", "arg2", "arg3"]
,输出为JS数组。这可以通过一个简单的.split(" ").
来完成然而,当尝试将数组格式化为命令参数时,我的问题就开始了。我的目标是允许用户以数组的格式输入一个参数(例如,从[
开始可能包含由,
分隔的多个元素,并以]
结束),因此例如:"arg1 [elem1, elem2] arg3"
转换为["arg1", ["elem1", "elem2"], "arg3"]
,其中内部和外部数组是一个JS数组。
我尝试过使用JSON.Parse(),但是,每个元素都要求用户在每个元素的开始处设置"
,这对于用户来说太复杂了,并且不需要输入。此外,元素可能并不总是想要为string
类型,也可能是Boolean、Number或自定义类型。
到目前为止,这是我最好的解决方案,但错过了一些要求,并且当数组内部有一个空间时也是不可用的。
s.split(/[[]]|s+/).filter(arg => arg.length > 1);
我已经提出了一些其他的解决方案,但在上述要求的规格集中都缺少这样或那样的东西。一个可以处理嵌套数组的解决方案会很好,但是它不是必需的,并且可能使解决方案比需要的更复杂。
假设没有有趣的字符作为输入。也不允许嵌套。
var str = "arg1 [ elem1 , elem2,elem3 ] arg3";
console.log(str)
// removing white spaces from the [ array ]
str = str.replace(/s*,s*/g, ',');
str = str.replace(/[s*/g, '[');
str = str.replace(/s*]/g, ']');
// now split on words
var arr = str.split(/s+/);
arr = arr.map(function(elem) {
// if begins with [ it is assumed to be an array to be splitted
return elem.charAt(0) == '[' ? elem.slice(1, -1).split(",") : elem;
})
console.log(arr)