无法清空JS数组

时间:2010-04-19 20:28:45

标签: javascript jquery arrays

是的,我遇到了这个非常基本的问题(或者似乎是这样)。我是JS的新手,仍然试图了解它,但我对PHP非常熟悉,从未经历过这样的事情。我只是无法清空这个该死的阵列,每次运行时,东西都会被添加到最后。

我不知道为什么,我开始认为它与chekbox id的命名方式有某种关系,但我可能会误会......

id="alias[1321-213]"id="alias[1128-397]"id="alias[77-5467]"等等。

我试过坚持

checkboxes = [];checkboxes.length = 0;

在每个可能的地方。在函数开始之后,在函数结束时,甚至在函数结束之前,但它没有帮助,并且清空此数组的唯一方法是重新加载页面。请告诉我我做错了什么,或者至少把我指向一个可以RTFM的地方。我完全没有想法。

function() {

    var checkboxes = new Array();
    checkboxes = $(':input[name="checkbox"]');

        $.each(checkboxes,
            function(key, value) {
                     console.log(value.id);                            
                     alert(value.id);
          }
        );
     checkboxes.length = 0;                          
}

我还读了Mastering Javascript Arrays 3次以确保我没有做错什么,但仍然无法弄明白....

5 个答案:

答案 0 :(得分:4)

我认为这有很多混乱,因为正在清除阵列 - 可能不是出于你想要的目的,或者在错误的时间等等。

function () {
    var checkboxes = new Array();               // local-scope variable
    checkboxes = $(':input[name="checkbox"]');  // new instance

    $.each(checkboxes, /* ... */);              // (truncated for brevity)

    checkboxes.length = 0;                      // this clears the array
                                                // but, for what...?
                                                // nothing happens now
}

根据你的代码片段,每次调用函数都会重新创建并清除数组。但是,所有使用数组的工作都是在数组已满时完成的(清除后没有任何反应)。

此外,checkboxes是函数的私有变量。该变量仅在执行函数期间存在,并且在函数完成后将被遗忘。

那么,大局是什么? 为什么你想要清除阵列?


为了猜测,听起来你打算在下一次调用函数时清除它 即(填写doSomething函数名称):

doSomething(); // log all array elements and clears the array
doSomething(); // does nothing, since the array is already empty

要实现这一点,您需要在函数外部的单个位置定义checkboxes,作为全局变量或使用闭包(更强烈建议,尽管更复杂,选项):

  

注意:如果您之前没有处理过闭包,那么只有一个例子后它们可能没什么意义。但是,有thousands of resources available,包括Stack Overflow,以帮助解释它们比我在这里更好。

// closure (or instantly-called function)
// allows for defining private variables, since they are only known by
// code blocks within this function

(function () {
    // private (closure-scoped) variable(s)
    var checkboxes = $(':input[name="checkbox"]');

    function doSomething() {
        $.each(checkboxes, /* ... */);

        checkboxes.length = 0;
    }
})();

闭包将运行一次,将checkboxes定义为输入数组,而doSomething将在清除之前迭代数组。

现在,最后一步是公开 doSomething - 因为与checkboxes一样,它也是私有的。你可以通过将函数引用从闭包传递给闭包之外的变量来完成它的暴露:

 var doSomething = (function () {
     /* ... */

     return doSomething;  // note that you DO NOT want parenthesis here
 })();

答案 1 :(得分:2)

设定长度是否可行? ;)

任何方式复选框都是jquery对象而不是数组。

当你checkboxes = $(':input[name="checkbox"]');时,它不再是一个阵列,而且之前的任何东西都没有影响力。如果你用我所知道的任何语言分配一些新内容,那么变量中的内容并不重要。

您正在制作一些与jquery相关的错误。请详细说明,以便我可以提供帮助

你确定在所有这些中都放了name =“checkbox”吗?它似乎没有多大意义。也许你已经$(':input[ 类型 ="checkbox"]');

编辑:这很有趣。上面的选择器也不太好。它应该是:

$('input:checkbox'); 

至于移除东西:

删除 varname

删除 arrname [elem]

是正确的方法。

指定null不会改变长度,但只会造成麻烦。

答案 2 :(得分:0)

这样做:

checkboxes = new Array();

答案 3 :(得分:0)

您也可以将其删除。

delete checkboxes;

答案 4 :(得分:0)

当您重新运行该功能时,它将再次搜索所有复选框。

考虑这个策略:

function() {
  var checkboxes = $(':input[name=checkbox]:not(.examined)');
  checkboxes.addClass('examined');

  $.each(checkboxes, function(key, value) {
      // ... stuff
  });
}

如果您不想“污染”DOM,也可以使用.data()