2016-04-03 123 views
0

我需要創建一個函數來對字符串進行排序。字符串中的每個單詞都將包含一個單一的數字。數字可以從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; 
      } 
     } 
     } 
    } 
    } 

的問題是它一直顯示「類型錯誤:無法調用未定義的方法‘的indexOf’在訂單」。請幫忙謝謝!

+1

所有'I-1'應該是'J-1'。 –

+2

爲什麼'i'從'1'轉到'9'?爲什麼'j'不用? – Oriol

回答

2

我一直在想弄清楚第一個循環在做什麼,我終於意識到它正在檢查字符串中的數字。你不應該那樣做,因爲它是怪異的,2)如果它有效,就不是高性能的。

而是使用一個循環和一個正則表達式來查找字符串中的數字。

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

相關問題