2016-07-05 9 views
0

配列中に存在する数字に応じて文字列を配列しようとしています。 'h2ello f3ere b1ow'は['b1ow'、 'h2ello'、 'f3ere']の配列を返さなければなりません。次のコードは2つの要素(h2elloとb1ow)で動作しますが、3番目の要素を追加したときは動作しません。なぜ誰がこのアイデアを持っていますか?文字列内の数字に応じて配列の文字列を配列します。

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

私はより良い性能を持っているか分かりません。 BTWの鉱山では、比較ごとに1つ少ない正規表現の一致があります。

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);