我有一个算法,用户将输入一个字符串,我会将其解析成2维以上的数组。因此,例如,用户可以输入1,2,3; 4,5,6并设置要由分号和逗号分析的文本。第一次传递将创建一个包含2个条目的数组。第二次传递将在两个先前的点中创建一个3条目数组。
用户可以添加或删除用于解析原始字符串(如分号或逗号)的文本项数,这意味着生成的数组可以包含与解析项一样多的维。
这似乎不是一个难题,但我遇到了一些障碍。
到目前为止,这是我的代码。
vm.parsers = [';', ','];
vm.inputString = "1,2,3,4,5;6,7,8,9,10";
function parseDatasetText( )
{
vm.real = vm.parseMe( vm.inputString, 0);
};
function parseMe( itemToParse, indexToParse )
{
if ( indexToParse < vm.parsers.length )
{
console.log('Parsing *'+itemToParse+'* with '+vm.parsers[indexToParse]);
var tempResults = itemToParse.split( vm.parsers[indexToParse] );
for (var a=0; a<tempResults.length; a++)
{
console.log('Pushing '+tempResults[a]);
tempResults[a] = vm.parseMe( tempResults[a], parseInt( indexToParse ) + 1 )
console.log('This value is '+tempResults[a]);
}
}else
{
console.log('Returning '+itemToParse);
return itemToParse
}
};
从控制台日志中可以看出,算法在最后一次解析后吐出一个未定义的,并且最终答案是未定义的。
也许我只是没有睡觉,但我认为数组会通过分裂递归填充?
由于
答案 0 :(得分:2)
function parseDatasetText(){
//composing parser from right to left into a single function
//that applies them from left to right on the data
var fn = vm.parsers.reduceRight(
(nextFn, delimiter) => v => String(v).split(delimiter).map(nextFn),
v => v
);
return fn( vm.inputString );
}
不知道还有什么要补充。
答案 1 :(得分:1)
以下功能应符合您的要求,如果不是,请告诉我
var parsers = [';', ',', ':'],
inputString = "1:a,2:b,3:c,4:d,5:e;6:f,7:g,8:h,9:i,10:j",
Result = [];
function Split(incoming) {
var temp = null;
for (var i = 0; i < parsers.length; i++)
if (incoming.indexOf(parsers[i]) >= 0) {
temp = incoming.split(parsers[i]);
break;
}
if (temp == null) return incoming;
var outgoing = [];
for (var i = 0; i < temp.length; i++)
outgoing[outgoing.length] = Split(temp[i])
return outgoing;
}
Result = Split(inputString);
在https://jsfiddle.net/cgy7nre1/
上试试添加了另一个inputString和另一组解析器:https://jsfiddle.net/cgy7nre1/1/
答案 2 :(得分:0)
你的意思是?
var inputString = "1,2,3,4,5;6,7,8,9,10";
var array=inputString.split(';');
for (var i=0;i<array.length;i++){
array[i]=array[i].split(',');
}
console.log(array);
答案 3 :(得分:0)
您可以使用如下的简单递归函数(此处为3个不同分隔符的示例):
function multiSplit(xs, delimiters) {
if (!delimiters.length) return xs;
return xs.split(delimiters[0]).map(x => multiSplit(x, delimiters.slice(1)));
}
data = '1:10,2:20,3:30;4:40,5:50,6:60';
res = multiSplit(data, [';', ',', ':']);
console.log(res)