这是我第一次使用这个网站。我正在研究一个代码,我正在努力解决这个问题。我无法按要求获得输出。这是关于排序数组。我知道我应该使用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
或其他东西吗?
答案 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(' '));

替代排序方法是:
...
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; }