0

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

现在,我认为这是我可以揭示这个问题的最好/最短的方法,而不会因为我向人们解释事情的坏习惯而过度使用它。如果有人想查看正在发生的事情,我目前有一个网页可用,因为GamesReset如果我是你,我也不知道发生了什么,在这里 (url 已删除,阅读编辑)。要使错误正常工作,只需将年龄更改为 10 而不选中任何框。底部段落是GamesReset数组(<br>用于分隔每个数组),它是我只更改时更改的那个FilterList在 JavaScript 中。与我上面提到的相比,如果您查看页面源代码,实际代码可能会有些偏差,但几乎 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,但它仍然存在。

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

4

2 回答 2

5

分配时不会复制数组,两个变量将引用相同的数据。这是一篇详细介绍此问题的帖子:Copying array by value in JavaScript

于 2013-01-14T00:17:35.713 回答
4

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

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 回答