簡體   English   中英

無法清空JS數組

[英]Can't empty JS array

是的,我對此非常基本(或似乎如此)的東西有疑問。 我對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 ,以確保我沒有做錯什么,但是仍然無法弄清楚。

我認為這會引起很多混亂,因為正在清理陣列 -可能不是出於您想要的目的,或者在錯誤的時間等。

 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 ,既可以將其定義為全局變量,也可以使用閉包( 盡管建議使用更復雜的選項,但建議使用閉包):

注意 :如果您以前沒有處理過閉包,那么僅舉一個例子就可能沒有太大意義。 但是,有成千上萬的可用資源 ,包括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
 })();

是否可以設定長度? ;)

復選框無論如何都是一個jquery對象而不是一個數組。

當您做checkboxes = $(':input[name="checkbox"]'); 它不再是數組,以前的任何東西都沒有影響。 如果用我知道的任何語言為變量分配新內容,則變量中的內容無關緊要。

您正在犯一些與jQuery有關的錯誤。 請詳細說明,以便我能提供幫助

您確定將所有名稱都放在name =“ checkbox”嗎? 似乎沒有太多意義。 也許您需要$(':input[ type ="checkbox"]');

編輯:這很有趣。 上面的選擇器也不是很好。 它應該是:

$('input:checkbox'); 

至於去除東西:

刪除變量名

刪除 arrname [elem]

是正確的方法。

分配null不會更改長度,只會帶來麻煩。

怎么辦呢:

checkboxes = new Array();

您也可以刪除它。

delete checkboxes;

當您重新運行該功能時,它將再次搜索所有復選框。

考慮以下策略:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM