2011-11-06 22 views
1

爲什麼我的數組長度總是爲0,即使var email等於一個字符串。 (我提醒了無功電子郵件和數據在那裏)。Javascript/JQuery中的動態數組

var emails = new Array(); 

    //get all the emails 
    $('.emailBox input').each(function (i) 
    { 
     var email = $(this).val(); 

     if(email != '') 
     { 
      emails[email] = email; 
      alert(emails.length); 
     } 
    }); 
+0

誰降低了這個數字?這是一個完全有效的問題(我upvoted回到零) –

+0

非常感謝那 – cdub

回答

3

因爲您正在向數組添加屬性。

var a = []; 
a.foo = 42; 
a.length === 0; // true 

而是嘗試

emails.push(email);

這是一樣的emails[emails.length] = email

順便說一句:

var emails = new Array();

是壞的。您應該使用[]而不是new Array(),主要是因爲它更簡潔易讀。

if (email != '') {

上面可以用if (email) {的情況下,jQuery的不斷返回undefinednull

要使整個代碼更優雅代替你應該使用

var emails = $('.emailBox input').map(function() { 
    return this.value; 
}).filter(function (k, v) { return v; }).get(); 

或者沒有jQuery的

var emails = [].map.call(document.querySelectorAll(".emailBox input"), function (v) { 
    return v.value; 
}).filter(function (v) { return v; }); 

儘管您需要QSA墊片和ES5墊片以實現傳統平臺支持。

編輯:

如果你想在陣列是唯一的,然後酌減。

var arr = arr.reduce(function (memo, val, key, arr) { 
    // if the first index of the value is the index then add it. 
    // if the first index is different then we already have it. 
    if (arr.indexOf(val) === key) { 
    memo.push(val); 
    } 
    return memo; 
}, []); 
+0

我如何讓這些值獨一無二? – cdub

+0

雖然我同意OP應該使用'[]'而不是'new Array()',你會說前者更具可讀性嗎(特別是對於初學者)? – alex

+0

您的jQuery代碼將返回一個不同的集合,然後OP的代碼(它不會添加* falsy *電子郵件),並且還會在OP需要數組時返回jQuery對象。 [的jsfiddle](http://jsfiddle.net/AYgBE/)。 – alex

-1

電子郵件[email] =電子郵件沒有做你想做的事。嘗試

emails.push(email); 
+3

爲什麼不是這樣?這對我來說可以。它可能不是OP *想要的*,但它是完全有效的。 –

+0

如果電子郵件是一個對象,那麼它會工作(因爲你設置一個鍵有一個值),但它是一個具有數字索引的數組。我不明白它會將電子郵件地址作爲索引來做什麼? (雖然你可以爭辯說Array也是一個對象:)) – Todd

+0

存儲它,然後查看它 - 它只是一個屬性。數組是對象 - 嘗試一下。 –

1

你可以使用一些jQuery方法來做所有的事情。

var emails = $('.emailBox input') 
       .map(function() { return $(this).val() || null; }) 
       .get(); 

jsFiddle