【问题标题】:Can't empty JS array无法清空 JS 数组
【发布时间】:2010-04-19 20:28:44
【问题描述】:

是的,我对这个非常基本的(或看起来如此)的事情有疑问。我对 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;                          
}

我还阅读了 3 遍 Mastering Javascript Arrays 以确保我没有做错什么,但仍然无法弄清楚....

【问题讨论】:

  • 您是要清空数组,还是创建一个新数组并将其分配给同一个checkboxes 变量?
  • 我真的不知道我应该怎么做,但是每次函数运行时都必须使用动态数量的元素重新填充/重新创建这个数组。
  • 我很确定双引号不应该出现在 jQuery 选择器中。您是否尝试过checkboxes = $('input[type=checkbox]'); 获取页面上的所有复选框?
  • 当我看到console.logalert 背靠背时,我可以想象到沮丧的程度:)

标签: javascript jquery arrays


【解决方案1】:

我认为这会导致很多混乱,因为正在清除数组——可能不是出于您想要的目的,或者在错误的时间等。

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
}

根据您的 sn-p,对函数的每次调用都会重新创建并清除数组。但是,数组的所有工作都是在数组已满时完成的(清除后没有任何反应)。

另外,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 分。不幸的是,将新的数组定义放在我的函数之外并没有帮助。我已经尝试了我可能(并且在逻辑上)可以的每一个位置,但无济于事。新元素只是被添加到旧数组中,我无法让它工作。闭包似乎是一个有趣的概念,但我认为我不能在我的代码中使用它:pastebin.com/AFfqKBis 可能我的代码根本上是错误的,因为这是我第一次使用 JS...
  • 您的问题是在 DOM 中留下了一些混乱,而您放在这里的功能还可以。真的。
【解决方案2】:

是否可以设置长度? ;)

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

当您执行checkboxes = $(':input[name="checkbox"]'); 时,它不再是数组,之前的任何内容都没有影响。如果你用我知道的任何语言为它分配新的东西,那么变量中的内容并不重要。

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

你确定你把 name="checkbox" 放在所有的地方吗?好像没有多大意义。或许你已经衰弱了$(':input[type="checkbox"]');

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

$('input:checkbox'); 

至于删除东西:

删除变量名

删除 arrname[elem]

是正确的做法。

分配 null 不会改变长度,只会造成麻烦。

【讨论】:

  • 我从 PHP 页面获取到 jQuery UI 模式对话框的数据和复选框。数据显示得很好,我可以检查元素并查看一切是否正确。所有复选框都有相同的name="checkbox",只是每次运行后数组似乎都没有被清空。另外,我试过delete checkboxes,但它似乎也不起作用。也许我的代码中其他地方存在问题,但我只能将其缩小到这个特定的功能......
  • 您在选择它们时出现错误。变量很好。首先去掉开头的:,然后 - 获取萤火虫,看看您的网站是否只包含您想要的复选框。我想在某个地方有一些旧的隐藏的。
  • 是的,我使用 Chrome,console.log(value.id); 在控制台中记录所有内容。每次我在alert() 对话框上点击 OK 时,我都可以看到记录的每个复选框 ID,所以所有元素都在那里,就在我关闭对话框并再次打开它时,复选框数组仍然包含上一次运行的元素.得跑去开会了,等我回来汇报进度。谢谢
  • 查看旧的复选框是否以某种方式保留在 DOM 中。如果$( ) 返回它们 - 它们必须存在。也许您隐藏了对话框并创建了一个新对话框,而另一个仍然隐藏在 DOM 中。要快速检查它,请将:visible 添加到您的选择器。如果它解决了问题 - 你应该开始清理。
【解决方案3】:

这样做怎么样:

checkboxes = new Array();

【讨论】:

  • 是的。这是函数中的第一行...也尝试在末尾添加它,但没有帮助...
【解决方案4】:

你也可以删除它。

delete checkboxes;

【讨论】:

  • delete 不适用于使用var 语句声明的变量,这些标识符是Variable Object 的属性,它们是使用{ DontDelete } 特殊属性创建的,给出一个看这篇文章:Understanding delete
【解决方案5】:

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

考虑这个策略:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2012-04-05
    • 2018-04-04
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多