在javascript

时间:2016-08-26 13:45:39

标签: javascript arrays algorithm parsing recursion

我有一个算法,用户将输入一个字符串,我会将其解析成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
    }
}; 

从控制台日志中可以看出,算法在最后一次解析后吐出一个未定义的,并且最终答案是未定义的。

也许我只是没有睡觉,但我认为数组会通过分裂递归填充​​?

由于

4 个答案:

答案 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/

上试试

编辑1 -

添加了另一个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)