在JavaScript中将for循环转换为while循环

时间:2013-10-23 01:15:46

标签: javascript loops for-loop while-loop

我一直在尝试将以下使用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;

任何人都可以帮助我吗?谢谢!

3 个答案:

答案 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循环会自动更新循环索引,在您的情况下为xwhile循环没有。因此,要复制for循环,您需要手动增加x

此外,您在for循环的顶部进行测试。要镜像该行为,您需要在执行每个循环之前while而不是do - whilewhile测试,do - while之后的测试。

但是如果使用了while循环,那么第一次array[x] != array[x-1]失败时就会退出循环。听起来你不想那样。您希望推送符合该测试的所有值。