为了好玩,我在CheckiO上启动了一些JavaScript。中等任务我遇到了问题。首先,我尝试使用for
循环对给定数组进行排序。为了在循环期间看到数组,我使用了console.log
。
for (var i = 0; i < data.length-1; i++) {
if (data[i] > data[i+1]) {
var temp = data[i];
data[i] = data[i+1];
data[i+1] = temp;
i = 0;
}
console.log(data);
}
问题是当错误的位置只有一个数字时;排序停止,只打印几次数组。 例如:
median([5,4,3,2,1])
[ 4, 5, 3, 2, 1 ]
[ 4, 3, 5, 2, 1 ]
[ 4, 3, 5, 2, 1 ]
[ 4, 3, 2, 5, 1 ]
[ 4, 2, 3, 5, 1 ]
[ 4, 2, 3, 5, 1 ]
[ 4, 2, 3, 5, 1 ]
[ 4, 2, 3, 1, 5 ]
[ 4, 2, 3, 1, 5 ]
[ 4, 2, 1, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
这种行为有什么解释吗?谢谢!
答案 0 :(得分:1)
在JavaScripts Array原型对象上为您实现了一个很棒的排序功能。
http://vim.wikia.com/wiki/VimTip91
但是,我打赌你知道这一点,并且正在实现此代码用于学习目的。
您的版本中的错误与此变量i
相反,试试这个:
var i = 0;
while(i < data.length) {
if(data[i] > data[i + 1]) {
var temp = data[i];
data[i] = data[i + 1];
data[i + 1] = temp;
i = 0;
continue;
}
i += 1;
}
由于我们不知道所需的迭代次数,因此使用while
循环而不是for
循环更为合适和清晰。这样,代码就清晰了,只有在逻辑i
语句的计算结果为false时才会增加if
。
答案 1 :(得分:0)
你的代码失败了,因为即使你在if块中生成docker run -p 80:80 nginx
,迭代完成后我也会增加并变为1,所以它再也不会检查数据[0]。
你可以这样做:
i=0
答案 2 :(得分:0)
您编写的代码看起来很好,但由于循环迭代为i值添加+1,因此它不会检查第一个元素。
要解决此问题,只需设置i = -1;
而不是i = 0;
。
median([5,4,3,2,1]);
function median(data) {
for(var i = 0; i < data.length-1; i++) {
//console.log(i, data[i], data[i+1], data);
if(data[i]>data[i+1]) {
var temp = data[i];
data[i] = data[i+1];
data[i+1] = temp;
i=-1; // Reset iterator so it is back to 0 on the next loop.
}
console.log(data);
}
}
编辑:我在代码段中添加了注释掉的代码行。如果取消注释并注释其他console.log,您将获得控制台的输出,显示您所在的索引,该索引的值,您将其与之比较的索引处的值,然后是当前数组的状态。尝试将-1更改为0
并查看它与重置为-1
的区别。
答案 3 :(得分:0)
var a =[ 4, 5, 3, 2, 1 ];
var b =[ 4, 3, 5, 1, 2 ];
var c =[ 5, 3, 4, 2, 1 ];
function mySort(inArray) {
return inArray.sort(function(x,y) { return x>y ? 1 : -1});
}
console.log( mySort(a) );
console.log( mySort(b) );
console.log( mySort(c) );
这就是你要找的东西吗?