2016-04-03 11 views
0

文字列をソートする関数を作成する必要があります。文字列の各単語には1つの数字が含まれます。数字は1〜9(0はありません)です。Javascript注文時に未定義のメソッド 'indexOf'を呼び出せません

たとえば、入力が "is2 Thi1s T4est 3a"の場合、関数は "Thi1s is2 3a T4est"を返します。

私のコードは次のとおりです。

function order(words) 
{ 
// ... 

    if(words == '') 
    { 
     return words; 
    } 

    var all_words = words.split(" "); 
    var checked_words = new Array(); 
    var joined_words = ""; 

    for(i = 1; i <= 9; i++) 
    { 
     //console.log(checked_words); 
     //checked_words[i-1] = all_words; 
     for(j = 1;j <= all_words.length; j++) 
     { 
     if(all_words[i-1].indexOf(i) != -1) 
     { 
      checked_words.push(all_words[i-1]); 

      if(i == (all_words.length)) 
      { 
      joined_words = checked_words.join(" "); 
      return joined_words; 
      } 
     } 
     } 
    } 
    } 

問題は、それが示すままである「はTypeError:順序で未定義のメソッド 『のindexOf』を呼び出すことはできません」。助けてくれてありがとう!

+1

すべての 'I-1 'は、' J-1'でなければなりません。 –

+2

なぜ 'i'は' 1'から '9'になりますか? 'j'が使われないのはなぜですか? – Oriol

答えて

2

私は最初のループが何をしているのか把握しようとしていました。そして、私は最後に文字列の数字をチェックしていることに気付きました。そういうわけではありません。なぜなら、それは1)変わったもの、2)それがうまくいかなかったからです。

代わりに1つのループと正規表現を使用して、文字列内の数字を探します。

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

    // take the first match and coerce it to an integer 
    var n = +all_words[i].match(/\d+/)[0]; 
    checked_words[n] = all_words[i]; 
} 

// checked_words has an undefined element at index 0; 
// slice takes a copy of the array from index 1 
return checked_words.slice(1).join(' '); 

DEMO

また、あなたがreduceを使用することができます。

var joined_words = str.split(' ').reduce(function (p, c) { 
    var n = +c.match(/\d+/)[0]; 
    p[n] = c; 
    return p; 
}, []).slice(1).join(' '); 

DEMO

あなたも、0から9の数字に縛られていません。限り、あなたは未定義の要素を除外するように、あなたは黄金だ...

var str = 'is2 Thi1s T4est 3a Ye12s!'; 

var out = str.split(' ').reduce(function (p, c) { 
    var n = +c.match(/\d+/)[0]; 
    p[n] = c; 
    return p; 
}, []).slice(1).filter(function (el) { 
    return el !== undefined; 
}).join(' '); 

DEMO

関連する問題