-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

あなたはとても近くにいます。以下は、元のシーケンスを保持します。

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 に答える
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 に答える