我一直在尝试将以下使用for循环的JS代码转换为while循环和/或do-while循环。
var unique = function(array)
{
var newArray = []
array.sort()
for(var x in array) if(array[x] != array[x-1]) newArray.push(array[x])
return newArray
}
代码假设只从重复的名称数组中返回不同的名称。我一直在尝试转换for循环,但到目前为止,我一直遇到问题:
do
{
newArray.push(array[x])
}
while(array[x] != array[x-1])
return newArray;
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:1)
是否保证您的名字只会按顺序重复,即如果名称确实有副本,它会直接在它之后复制吗?如果没有,那么检查直接在每个元素旁边的元素将找不到所有重复项。你必须做一个嵌套的for循环或其他一些n ^ 2算法。
var duplicated = false;
for (int x = 0; x < array.length; x++)
{
for (int y = 0; y < array.length; y++)
{
if (array[x] == array[y])
{
duplicated = true;
}
}
if (!duplicated)
{
array.push(array[x]);
}
duplicated = false;
}
return newArray;
请注意,这个实现非常差,但它得到了重点。
答案 1 :(得分:1)
你非常接近。以下内容保留了原始序列:
function getUnique(array) {
var newArray = array.slice(); // copy original
var i = newArray.length - 1;
do {
if (newArray[i] == newArray[--i]) {
newArray.splice(i, 1);
}
} while(i)
return newArray;
}
请注意,上面假设一个已排序的连续数组(没有缺少成员)。如果您无法确定,请在 do..while 循环之前对 newArray 进行排序,并将其压缩以使其连续。
答案 2 :(得分:0)
while
循环对您的用例没有意义。只要满足某些条件就可以循环while
循环,然后在第一次失败时停止。但是当你想要遍历一定数量的项目(例如所有项目)时,for
循环是好的。
坚持使用for
循环。还有一些关于while
循环的注释,无论何时使用它们都是:
for
循环会自动更新循环索引,在您的情况下为x
。 while
循环没有。因此,要复制for
循环,您需要手动增加x
。
此外,您在for
循环的顶部进行测试。要镜像该行为,您需要在执行每个循环之前while
而不是do
- while
(while
测试,do
- while
之后的测试。
但是如果使用了while循环,那么第一次array[x] != array[x-1]
失败时就会退出循环。听起来你不想那样。您希望推送符合该测试的所有值。