好吧,我简短易懂的解释就是这样。我有2个数组,FilterListGamesReset。每当我使用此功能并使用复选框和下拉菜单过滤掉某些游戏时,该功能就会以类似FilterList=GamesReset;的开头。在我过滤掉游戏的年龄之前,此功能似乎可以正常工作。除非是GamesResetwhile(i<GamesReset.length){}之类的函数,否则切勿触摸FilterList=GamesReset;。我筛选游戏时唯一使用的工具是FilterList.splice(i,1);。现在,据我所知,GamesReset绝对不应更改。我要重置FilterList,然后根据需要过滤掉的内容,它将开始从FilterList删除这些游戏。我的问题是GamesReset也被过滤了。这一点根本没有任何意义。因此,就像我的标题一样,就像说b=0;a=b;a++;,现在b等于1。

现在,我认为这是揭露此问题的最佳/最短方法,而又不会因我向人们解释事物的坏习惯而过度。如果有人想了解正在发生的事情,我现在有一个可用的网页,因为如果您在这里,我也无法了解GamesReset的发生情况(删除网址,阅读编辑)。要使错误生效,只需将年龄更改为10,而无需选中任何复选框。最下面的段落是GamesReset数组(使用<br>分隔每个数组),当我只在JavaScript中更改FilterList时,它就会更改。如果您查看页面源代码的实际代码可能与我上面提到的相比略有不同,但是几乎是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;时,我对该功能进行了一些更改,但这是另一项尝试,以确保GamesReset不会像FilterList那样被过滤,但仍然可以。

编辑:我删除了我的网址,因为答案肯定可以解释所有内容,因此现在不需要它了。

最佳答案

因为变量只是对内存中对象的引用,所以这很有意义。一个对象可以有多个引用。考虑一下:

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();

关于javascript - 老实说很难解释..我使用a = b之类的东西,然后使用a++,但b有所变化。除了这些是数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14309784/

10-12 21:08