最优雅的方式来分割字符串并找到其产生的有序组合

时间:2013-09-07 04:45:29

标签: javascript underscore.js

我正在寻找通过分隔符分割字符串并找到其可能组合的最优雅方式。

e.g:

'foo.bar.baz'

=>

['foo', 'foo.bar', 'foo.bar.baz']

我不介意使用下划线。

编辑:

到目前为止我尝试了什么

function comb(words) {                                                                                                                       
    var combinations = [];
    for (var i = 0; i < words.length; i++) {  
        var currentState = [];                                                                                                               
        for (var j = 0; j <= i; j++) {                                                                                                       
            currentState.push(words[j]);                                                                                                     
        }                                                                                                                                    
        console.log('current state', currentState.join('.'));                                                                                
        combinations.push(currentState.join('.'));                                                                                           
    }                                                                                                                                        
    return combinations;                                                                                                                     
}                                                                                                                                            

console.log('combinations', comb('foo.bar.baz'.split('.')));    

输出combinations [ 'foo', 'foo.bar', 'foo.bar.baz' ]

我将此用于具有嵌套状态的应用。例如:home.users.list已激活这些状态:homehome.usershome.users.list

3 个答案:

答案 0 :(得分:0)

我不确定什么构成“最优雅”,但这是一个使用下划线的相当紧凑的解决方案:

function comb(words) {
    var accumulate = "";
    return _.map(words.split("."), function(word) {
        var t = accumulate + word;
        accumulate = t + ".";
        return t;
    });
 }

与您的示例略有不同,因为comb的参数是您要拆分的字符串。显然,你可以在调用之前拆分,就像在你的例子中一样,而不是在函数内部进行。

答案 1 :(得分:0)

function comb(words) {
    var combinations = [], temp = "";
    for (var i = 0; i < words.length; i++) {
        combinations.push(temp + words[i]);
        temp += words[i] + ".";
    }
    return combinations;
}

console.log('combinations', comb('foo.bar.baz'.split('.'))); 

<强>输出

combinations [ 'foo', 'foo.bar', 'foo.bar.baz' ]

答案 2 :(得分:0)

另一种方式:

function comb(str) {
    var index = -1, arr = [];
    while( (index = str.indexOf('.', index + 1) ) >= 0 ) {
        arr.push(str.substring(0, index));
    }
    arr.push(str);
    return arr;
}

console.log("combinations are: " + comb("foo.bar.baz"));