0

さて、私の短くて簡単に説明できる説明はこれです。私は2つの配列を持っていFilterListますGamesReset. 私が持っているこの機能が機能し、チェックボックスとドロップダウンメニューでいくつかのゲームを除外するときはいつでも、機能は次のようなものから始まりますFilterList=GamesReset;。ゲームの年齢を除外するまで、この関数は正常に機能するようです。またはGamesResetのようなものでない限り、関数は決して触れません。そして、ゲームをフィルタリングするときに使用する唯一のツールは. これで、間違いなく、私の知る限り決して変わるべきではありません。をリセットする必要があります。次に、除外する必要があるものに応じて、それらのゲームを から削除し始めます。私が抱えている問題は、while(i<GamesReset.length){}FilterList=GamesReset;FilterList.splice(i,1);GamesResetFilterListFilterListGamesResetもフィルタリングされます。これは、まったく意味がありません。私のタイトルのように、 , , , and now equals 1 と言っているようb=0;a=b;ものa++;ですb.

これが、人に物事を説明する私の悪い癖で無理をせずに、この問題を明らかにする最善/最短の方法だと思います。GamesReset誰かが実際に何が起こっているかを見たい場合は、現在利用可能なWebページがあります. エラーを機能させるには、ボックスをチェックせずに年齢を 10 に変更します。一番下の段落はGamesReset配列 (<br>各配列を区切るために使用) であり、私が変更するだけのときに変更されるものです。FilterListJavaScript で。ページソースを見ると実際のコードは上で述べた時と比べて少しずれているかもしれませんが、ほぼ100%同じものです。また、URL なしでこのページでコードを利用できるようにしたかったのですが、含まれている html タグを使用してそれを行う方法がわかりません。

実際には、これが JavaScript 関数です。私の質問が拒否されたとき、私はちょうど4つのスペースのことを理解しました.

function SearchFilter() {
  Games = GamesReset;
  plat = document.getElementById('platformcheck').checked;
  rpg = document.getElementById('rpgcheck').checked;
  puzz = document.getElementById('puzzlecheck').checked;
  hybo = document.getElementById('hybocollectcheck').checked;
  ages = document.getElementById('agescheck').value;
  if ((!plat) && (!rpg) && (!puzz) && (!hybo)) {
    FilterList = Games;
  } else {
    FilterList = [];
    i = 0;
    while (i < Games.length) {
      Set = '';
      Set = Games[i];
      Set = Set.split('</>');
      StrFind = Set[0];
      if (
        (plat && (StrFind.search(',platform,') > -1)) || (rpg && (StrFind.search(',rpg,') > -1)) || (puzz && (StrFind.search(',puzzle,') > -1)) || (hybo && (StrFind.search(',hybocollect,') > -1))) {
        FilterList.push(Games[i]);
      }
      i++;
    }
    // so by now, we should have the filtered array
  }
  //seperate filter for ages
  i = 0;
  while (i < FilterList.length) { //The problem should definitely start here
    Set = '';
    Set = FilterList[i];
    Set = Set.split('</>');
    StrFind = Set[1];
    if ((Math.abs(StrFind)) > ages) {
      FilterList.splice(i, 1);
    } else {
      i++;
    }
  }
  GL.innerHTML = GamesReset.join('<br>');
}

注意点として、年齢フィルターが機能しているときに問題が発生します。そしてそれがする唯一のことはFilterList.splice(i,1);. しかし、それは変化してしまいますGamesReset。を追加したときにこの関数を少し変更しましたが、それは が のようにフィルタリングされないようGames=GamesReset;にするための別のテストでしたが、それでもフィルタリングされます。GamesResetFilterList

編集:答えがすべてを明確に説明しているので、URLを削除したので、今は必要ありません。

4

2 に答える 2

5

配列は割り当て時にコピーされません。両方の変数が同じデータを参照します。これについて詳しく説明する投稿は次のとおりです。JavaScriptで値ごとに配列をコピーする

于 2013-01-14T00:17:35.713 に答える
4

変数はメモリ内のオブジェクトへの単なる参照であるため、これは完全に理にかなっています。1つのオブジェクトに複数の参照を含めることができます。このことを考慮:

var a = { foo: 'bar' };
var b = a;

// b is now a reference to a and they both point to the same object

b.foo = 'doe';
alert( a.foo ); // alerts doe

同じことがアレイにも当てはまります。したがってFilterList = GamesReset、配列をコピーするのではなく、同じ配列を別の変数に割り当てるだけです。いずれかの参照に加えられた変更または変更は、すべての参照に反映されます。

配列のコピーを作成するには、次を使用できますslice

FilterList = GamesReset.slice();
于 2013-01-14T00:17:56.840 に答える