2014-09-11 18 views
2

我想分割字符串如何分割與分類彙總前綴字符串

'something.somethingMore.evenMore[123].last' 

['something', 
'something.somethingMore', 
'something.somethingMore.evenMore[123]', 
'something.somethingMore.evenMore[123].last'] 

我想不出簡單的解決方案通過分離分裂字符串「」,但與前字符串的內容。

回答

3

現代JS編程風格會像

str            //take the input 
    .split('.')         //and split it into array of segments, 
    .map(          //which we map into a new array, 
     function(segment, index, segments)  //where for each segment 
      return segments.slice(0, index+1) //we take the segments up to its index 
       .join(".")      //and put them back together with '.' 
      ; 
     } 
    ) 

這利用了這個事實,即Array#map函數不僅傳遞當前值,還傳遞其索引和整個輸入數組。這使我們可以很容易地使用slice來獲得一個包含所有段到當前段的數組。

+0

很好的解決方案。謝謝。我試圖與正則表達式匹配,但沒有運氣來通用。 – 2014-09-12 07:51:14

1

我想你會需要一個循環:

雖然發現「。」字符,返回一個列表子串直到新「。」指數。使用找到的最後一個正確索引開始每個搜索。

+0

是的,循環聽起來不錯。 – 2014-09-11 14:01:45

2

我不會把我的解決方案簡單,但:

function splitArrayIntoGoofyArray(val){ 
    var str =val.split("."), arr = []; 
    for (var x = str.length; x >= 1; x--){ 
    var cnt = str.length - x; 
    arr.push((cnt > 0) ? arr[cnt - 1] + "." + str[cnt] : str[cnt]); 
    } 
    return arr; 
} 
console.log(splitArrayIntoGoofyArray("aaa.bbb.ccc.ddd")); 

http://jsfiddle.net/7tav4sue/

2

你可以嘗試匹配,而不是分裂,

> var s = 'something.somethingMore.evenMore[123].last'; 
undefined 
> var regex = /(?=(^((([^.]*)\.[^.]*)\.[^.]*)\.[^.]*))/g; 
undefined 
> regex.exec(s) 
[ '', 
    'something.somethingMore.evenMore[123].last', 
    'something.somethingMore.evenMore[123]', 
    'something.somethingMore', 
    'something', 
    index: 0, 
    input: 'something.somethingMore.evenMore[123].last' ] 

爲了得到所需的輸出,

> regex.exec(s).slice(1,5) 
[ 'something.somethingMore.evenMore[123].last', 
    'something.somethingMore.evenMore[123]', 
    'something.somethingMore', 
    'something' ] 
+0

非常聰明,雖然我不太確定它是如何工作的。 – 2014-09-11 13:35:27

+0

你不需要這裏的正則表達式。您可以分割並循環 – user3077033 2014-09-11 13:37:43

+0

如果超過3個點,這將不起作用。 – DrGeneral 2014-09-11 13:59:31

2

這取決於什麼是簡單的解決方案。 做到這一點最簡單的方法是創建第一陣列

var str = 'something.somethingMore.evenMore[123].last'; 
var arr = str.split('.'); 

然後填寫新的數組與此數據

var result = []; 
for (var i = 0; i < arr.length; i++) { 
    var item = []; 
    for (var j = 0; j <= i; j++) { 
     item.push(arr[j]); 
    } 
    result.push(item.join('.')) 
}