-1

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

谁能帮我?谢谢!

4

3 回答 3

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;

请注意,这个实现非常糟糕,但它明白了这一点。

于 2013-10-23T01:25:43.677 回答
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进行排序,并可能将其压缩以使其连续。

于 2013-10-23T02:07:32.680 回答
0

循环对您的while用例没有意义。当while您想要循环时,只要满足某些条件,然后在第一次失败时停止,循环就很好。但是,for当您想要遍历一定数量的项目(例如所有项目)时,循环是很好的。

所以坚持一个for循环。while每当你使用它们时,还有一些关于循环的注意事项:

for循环会自动更新循环索引,在您的情况下为x. while循环没有。因此,要复制您的for循环,您需要手动递增x.

for此外,您在循环的顶部进行测试。为了反映这种行为,您需要 awhile而不是do- while(while执行每个循环之前的测试,do-while之后的测试)。

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

于 2013-10-23T01:28:08.410 回答