2016-07-05 77 views
0

我試圖根據數字中存在的數字來排序數組中的字符串,即。 'h2ello f3ere b1ow'應該返回一個['b1ow','h2ello','f3ere']的數組。下面的代碼適用於兩個元素(h2ello和b1ow),但不添加第三個時。有沒有人有一個想法,爲什麼這是?根據字符串中的數字排序數組中的字符串

function order(words){ 
    var sentence = []; 
    words = words.split(" "); 
for (var i=0;i<words.length;i++){ 
    for (var m=0;m<words[i].length;m++){ 
    if (!isNaN(parseFloat(words[i][m])) && isFinite(words[i][m])){ 
    var idx = words[i][m]; 
     sentence.splice(idx, 0, words[i]); 
    } 
    } 
} 
console.log(sentence); 
} 

order('h2ello f3ere b1ow'); 

回答

0

如果檢查拼接文檔:Array splice,你會看到,如果指數大於數組的長度越長,它會被設置爲數組的長度。所以它只是在推動而不是設置你想要的索引。一種解決方案可以手動設置它:

sentence[idx-1] = words[i] 

根據你的需要,你也可以簡化您的功能相當多:

function order(words){ 
    words = words.split(" ").sort(function(a,b){ 
    return a.match(/\d/) - b.match(/\d/) // get first digit and compare them 
    }) 
console.log(words); 
} 
2

最簡單的將是直接的排序陣列,無需拼接其他地方未知的地方(循環中)。

本提案使用Array#sort,它帶有一個回調,該回調查找要排序的某個小數。

var array = 'h2ello f3ere b1ow'.split(' '); 
 

 
array.sort(function (a, b) { 
 
    return a.match(/\d+/) - b.match(/\d+/); 
 
}); 
 

 
console.log(array);

0

我不知道它有更好的表現。順便說一句,我比較每個正則表達式的匹配少一個。

var sorted = 'h2ello f3ere b1ow'.split(' ') 
 
    .map(w => ({ key: w.match(/\d+/)[0], word: w })) 
 
    .sort((a, b) => a.key - b.key) 
 
    .map(o => o.word).join(' '); 
 

 
console.log(sorted);