我正在寻找通过分隔符分割字符串并找到其可能组合的最优雅方式。
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
已激活这些状态:home
,home.users
,home.users.list
。
答案 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"));