我目前正在开展Codewars挑战,http://www.codewars.com/kata/your-order-please。任务是取一个字符串并根据在字符串的每个单词中找到的值重新排序单词,例如:“is2 Thi1s T4est 3a”该函数应返回“Thi1s is2 3a T4est”。
我编写了一个成功传递所有测试的解决方案并返回正确的字符串。 https://jsfiddle.net/louisstanard/5hygz6wb/
function order(words){
var ordered = [];
var arr = words.split(' ');
var n = 1;
while (n <= arr.length) {
for (var i = 0; i < arr.length; i++) {
var stringArr = arr[i].split('');
stringArr.forEach(function(currentValue, index) {
if (parseInt(currentValue) === n) {
ordered.push(arr[i]);
n++;
}
});
}
}
return ordered.join(' ');
}
我的问题是,当我尝试提交解决方案时,我收到一条错误消息“进程已终止。完成时间超过6000毫秒”。我选择使用while循环,因为我想继续迭代字符串中的每个单词以查找数字,直到我构建了一个长度与原始数组相同的新数组。
我是编写更多高性能JS的新手,但我知道虽然循环(可能是嵌套在一段时间内)可能是非常昂贵的操作。有没有人知道为什么这可能需要太长时间才能运行?我没有看到任何明显的性能问题吗?或者也许是一个更好的方法?谢谢!
答案 0 :(得分:0)
这是另一种方法:
function order(words){
return words
.split(' ')
.sort(function( wordA, wordB ) {
var numA = +(wordA.match(/\d+/g)[0]);
var numB = +(wordB.match(/\d+/g)[0]);
return numA - numB;
})
.join(' ');
}
答案 1 :(得分:0)
查看Fiddle here的更新。在我的Chrome浏览器上,显示比原始浏览器快一个数量级。
function orderNew(words){
var ordered = [];
var arr = words.split(' ');
arr.forEach(function(item, index){
var match = /\d+/.exec(item);
ordered[parseInt(match[0])] = item;
});
return ordered.join(' ');
}
答案 2 :(得分:0)
您的代码运行缓慢,因为您执行了大量不必要的计算:
简而言之,是的,使用其他人发布的技术之一会更高效,因为该代码更优化且不包含冗余逻辑。