根据文本中的数字排序

时间:2017-01-06 22:42:46

标签: javascript arrays string sorting

这是我第一次使用这个网站。我正在研究一个代码,我正在努力解决这个问题。我无法按要求获得输出。这是关于排序数组。我知道我应该使用array.sort(),但我必须使用自定义代码对它们进行排序,因为我拥有的字符串是:

is2 Thi1s T4est 3a

我正在使用array = str.split(" ")将此字符串转换为数组,其中的挑战是,我需要在其中找到数字。所以我真正想做的是,使用以下方式获取数字:

parseInt(array[i]);

它只能工作一次或两次。例如,对于上面的字符串,它给了我:

parseInt(array[0]);  // NaN
parseInt(array[1]);  // NaN
parseInt(array[2]);  // NaN
parseInt(array[3]);  // 3

我不确定如何可靠地从字符串中取出数字。我应该使用RegEx或其他东西吗?

4 个答案:

答案 0 :(得分:2)

parseInt()只会在字符串的开头解析一个数字,而不是在中间。使用正则表达式查找数字。这将在字符串中的任何位置找到第一个数字:

var match = str.match(/\d+/);
var number = match ? parseInt(match[0]) : 0;

答案 1 :(得分:1)

我非常感谢您提供如此详细的解释。如果数字隐藏在第一个字符后面,则第一个问题是使用parseInt()将无效。因此,要从文本中获取数字,请使用以下代码替换parseInt()代码:

array[i].match(/(\d+)/)[0]

这是一个正则表达式,它读取字符串并从数组中获取匹配的数字。

array[0].match(/(\d+)/)[0]  // 2
array[1].match(/(\d+)/)[0]  // 1
array[2].match(/(\d+)/)[0]  // 4
array[3].match(/(\d+)/)[0]  // 3

现在,由于您需要根据数字订购它们,您可以这样做。你需要根据数字把它们按正确的顺序排列,让我们用这样的方式定义一个最终的数组:

var finalArray = [];

我们需要根据您从数组中收到的值,使用正确的索引开始填充每个条目。即:

finalArray[0] = "Thi1s";
finalArray[1] = "is2";
finalArray[2] = "3a";
finalArray[3] = "T4est";

为此,我们可以循环或使用forEach()函数。我喜欢使用地图功能,但它比forEach重,而许多人更喜欢循环。所以,函数看起来像这样:

array.forEach(function (value) {
  // Value here is the current value. Could be Thi1s or something.
  finalArray[parseInt(array[i].match(/(\d+)/)[0])] = value;
});

现在我们填写了finalArray,现在是时候加入它们并将其作为返回值发送。

return finalArray.join(" "); // Join each with a space.

完整的代码将如下所示:

function getSortedValues(str) {
  var finalArray = [];
  str.split(" ").forEach(function (v) {
    if (!!v)
      finalArray[parseInt(v.match(/(\d+)/)[0])] = v;
  });
  return finalArray.join(" ").trim();
}

console.log(getSortedValues("is2 Thi1s T4est 3a"));

答案 2 :(得分:1)

  

这是关于排序数组。

使用String.prototype.match()Array.prototype.sort()String.prototype.localeCompare()(使用数字归类)功能的解决方案:



var s = 'is2 Thi1s T4est 3a',
    words = s.split(' ');

words.sort(function(a,b){
  return a.match(/\d+/)[0].localeCompare(b.match(/\d+/)[0], 'kn');
});

console.log(words.join(' '));




https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

替代排序方法是:

...
words.sort(function(a,b){
    return a.match(/\d+/)[0] - b.match(/\d+/)[0];
});

答案 3 :(得分:0)

您可以使用split代替match来获取数组中的单词,而只使用以数字开头的单词部分。

然后,您可以执行parseInt或一次性使用map(parseFloat)

var str = 'is2 Thi1s T4est 3a';
var array = str.match(/\d\S*/g);
console.log(array);
array = array.map(parseFloat);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }