根据字符串中的数字对数组中的字符串进行排序

时间:2016-07-05 18:10:30

标签: javascript string sorting integer

我试图根据数组中的数字来排序数组中的字符串,即。 ' h2ello f3ere b1ow'应该返回一个[' b1ow',' h2ello' ' f3ere&#39]。以下代码适用于两个元素(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');

3 个答案:

答案 0 :(得分:2)

最简单的是数组的直接排序,而不会拼接到其他地方未知的地方(在循环中)。

此提案使用带有回调的Array#sort,该回调查找要排序的小数。

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

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

console.log(array);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

如果检查splice上的文档:Array splice,您会看到如果索引长于数组的长度,它将被设置为数组的长度。所以它只是推动而不是设置你想要的索引。一种解决方案是手动设置:

propertyValue[KEY_NAME]

根据您的需要,您还可以简化您的功能:

sentence[idx-1] = words[i]

答案 2 :(得分:0)

我不知道哪个有更好的表现。 BTW我的每次比较只有一个正则表达式匹配。

&#13;
&#13;
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);
&#13;
&#13;
&#13;