2012-03-13 9 views
2

ドットとコンマの位置を配列に入れたい。配列内に複数の文字位置を取得しますか?

これはJavaScriptで行うことができますどのように
[0] > 1 
[1] > 5 
[2] > 9 

w.wer、広告、

のようなものを与える必要がありますか?

+0

あなたの例では、明らかではないが、あなたはコンマとドットインデックスをしたいですか? –

答えて

4
function getPositions(regex, str) { 
    var counts = [], m; 
    while (m = regex.exec(str)) { 
     counts.push(regex.lastIndex - m[0].length); 
    } 
    return counts; 
} 

// Usage: 
getPositions(/[,.]/g, 'w.wer,ads,'); // => [1,5,9] 
1
function dotsAndCommas(s) { 
    var rv = []; 
    for (var i = 0; i < s.length; ++i) { 
    if (s[i] === '.' || s[i] === ',') rv.push(i); 
    } 
    return rv; 
} 

基本的には、ただしてください。私が正規表現でそれを行うと考えることができる方法はありません。

var myString = "w.wer,ads,"; 
var matchedIndexes = []; 

for (var i = 0; i < myString.length; i++) { 
    if (myString[i] == "," || myString[i] == ".") { 
     matchedIndexes.push(i); 
    } 
} 

ここa working fiddleです:

3

は、以下の

var getAllIndexesOf = function(str, toFind) { 
    var all = []; 
    for (var i = 0; i < str.length; i++) { 
    if (toFind.indexOf(str[i]) >= 0) { 
     all.push(i); 
    } 
    } 
    return all; 
} 

var result = getAllIndexsOf("w.wer,ads,", [".", ","]); 
2

オプション1

は、単に文字列の各文字をループを試してみてください。あなたはそれを少し手の込んだ取得したい場合は、その位置の位置文字を格納するオブジェクトを作成することができ

オプション2

var myString = "w.wer,ads,"; 
var matchedIndexes = []; 

for (var i = 0; i < myString.length; i++) { 
    if (myString[i] == "," || myString[i] == ".") { 
     matchedIndexes.push(new myMatch(myString[i], i)); 
    } 
} 

function myMatch(position, character) { 
    this.position = position; 
    this.character = character; 
} 

結果:

Fancy Result

ここはa working fiddleです。

0

私は、文字列をループだろうとそうのように各文字をチェック:5つの解決策が既に存在しているので、私はほとんどワンライナーを書くつもり

var s = "w.wer,ads,"; 

    var arr = new Array(); 

    for(var i = 0; i < s.length; i++) { 

    if(s.charAt(i) == "." || s.charAt(i) == ",") 
     arr.push(i); 
    } 

    for(var i = 0; i < arr.length; i++) { 
     document.write(arr[i]); 
    } 
0

function dotsAndCommasPositions(str) { 
    var i = -1; 
    return str.split(/[.,]/).slice(0, -1).map(function(s){ return i += s.length + 1; }); 
}; 
+0

Lol、私は非常に似た考えがありました。 –

+0

あなたのソリューションは真の1ライナーですが、 'a.slice(0、i + 1).join( '')'はO(N )の実行時間になります。 – kirilloid

+0

もちろん、それは非常に醜いことは言うまでもありません。 :) –

0

あなたはすべての文字をループし、.,のインデックスを保存し関数を作成することができます。

​function getPositionsOfDotsCommas(str) { 
    var result = []; 

    for (var i = 0; i < str.length; i++) { 
     if (str[i] === '.' || str[i] === ',') { 
      result.push(i); 
     }   
    } 

    return result; 
}​ 
1
おそらく

理想的ではないが、思考実験として、ここでは、組み込みのJavaScriptの関数(明示的なループ)でそれを行う方法です:

var pos = mystr.split(/[,.]/).slice(0,-1).map(function(val, i, a) { return a.slice(0, i+1).join('').length+i; }); 

デモ:http://jsfiddle.net/jtbowden/hHSB2/

は、ネストした.slice()を取り除くには、O(n^2)

var pos = mystr.split(/[,.]/).slice(0,-1).map(function(val, i, a) { return a[i] = val.length+(a[i-1]||-1)+1; }); 

デモ:http://jsfiddle.net/jtbowden/hHSB2/1/

そして、まだ、それはまだ醜いと無意味です。

+0

awesomeness +1、scarinessのための-1:D –

+0

'map'はすべてのブラウザに組み込まれていません:-P – kirilloid

+0

@kirilloid:これは考えられた実験です。あなたはいつもこれをもっと素晴らしいものにすることができます:https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/map#Compatibility –

1

さらに別のほとんどワンライナー:

var q = []; 
[].forEach.call('w.wer,ads,', function(v, i) { /[,.]/.test(v) ? q.push(i) : 0 }); 
// q == [1,5,9] 
関連する問題