2015-05-14 160 views
3

這是我的第一個問題,在閱讀多年後,請對我好一點。JS數組聲明中的空元素

我在js/jq中遇到數組管理問題。

我有幾個元素的數組,它是用$ .each函數處理的。 我想提取匹配元素到另一個數組並返回這個數組。 但由於某種原因(不知道是否因爲數組聲明,jquery.each函數...)我有第一個空元素。

我覺得我比這更難理解了,所以做了jsfiddle。

var arr = new Array(); 
$.each([1,2,3], function(index,element){ 
    if (element == 2){ 
     arr[index] = element; 
    } 
}); 

arr必須只有一個元素,但arr.length返回2,因爲第一個數組槽是空的。

這裏是一個小提琴http://jsfiddle.net/moay7y95/

我很肯定,這是一個簡單而有點愚蠢的事情,但我沒能找到答案。

在此先感謝!

+0

我一直在想,如果使用數組是做到這一點的最好辦法。 最後,我將使用對象,聲明arr,如arr = {}。 與對象,我可以有索引像[1,4,5,6]沒有問題。 感謝您的所有答案! –

回答

3

最好的解決辦法:使用.filter

var arr = [1, 2, 3].filter(function(value){ 
    return value == 2 
}); 

如果返回值是true,該元素被返回數組中,否則將被忽略。這是純js,所以你不需要jquery。請參見文檔中關於.filter

您的問題:使用.push

嘗試使用.push方法在陣列上(見Mozilla's documentation)。

var arr = new Array(); 
$.each([1,2,3], function(index,element){ 
    if (element == 2){ 
     arr.push(element); 
    } 
}); 

.push方法將動態地增長您的陣列元素被添加。

您的問題是函數內index的值是您的初始數組中的參考點。這意味着如果你看看返回的數組,你會發現[undefined, 2],所以長度返回爲2.如果你的條件是element == 3,你將有兩個空插槽。

備選地:使用.grep

另一個jQuery的方法是$.grep。見http://api.jquery.com/jquery.grep/

var arr = $.grep([1, 2, 3], function (value) { 
    return value == 2 
}); 

這是jQuery的JavaScript實現的.filter的。

+0

非常感謝。我知道,stackoverflow非常好,但不是那麼多! 我對數組和json對象(我​​正在使用)感到困惑,沒有想到數組索引從0開始。 現在已經很清楚了。 –

2

您正在推送數組中的元素1 st索引。所以,javascript默認放undefined0 th索引。

因此,在each結束你的陣列將

[undefined, 2]; 

這是你得到的length爲2

您可以使用push在陣列添加元素的原因:

$.each([1, 2, 3], function (index, element) { 
    if (element == 2) { 
     arr.push(element); 
     elem++; 
    } 
}); 

演示:https://jsfiddle.net/tusharj/moay7y95/2/

push()方法將一個或多個元素添加到數組的末尾並返回數組的新長度。

文檔:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push

0
[1, 2, 3] 

if (element == 2) 

arr[index] = element; 

這意味着你設置改編[1]至元素。

如果想將其添加到ARR順序(填充它正常),成藝術

arr.push(element);

2

你的陣列[1, 2, 3]具有三個元件和三個相關的索引:0, 1和2.在您的$.each()循環的每個迭代中,該索引及其值將傳遞給該函數。

所以第一個呼叫獲得0, 1作爲其參數傳遞。第二個呼叫被1, 2傳遞作爲參數,則if語句條件計算爲真,那麼你的代碼:

arr[index] = element; 

實際上相當於

arr[1] = 2; 

既然你在插入索引的元素1,你會擁有一個空的索引0

你可以而不是簡單地使用Array.push()的元素添加到陣列:

arr.push(element); 
2

如已經提到的問題是要在索引1指定的值,所以該陣列將被視爲長度的2

一種解決方案是使用.push(),而不是基於索引分配。

另一種方法可以是使用Array.filter()並返回true,如果該元素的conditon匹配

var arr = [1, 2, 3].filter(function(value){ 
    return value == 2 
}); 

演示:Fiddle


使用$.grep()

var arr = $.grep([1, 2, 3], function (value) { 
    return value == 2 
}); 
0

好像你正在尋找Array.filter (MDN)

var elems = ["car", "bike"]; 
var arr = [1, 2, 3, "car", 5, "bike"].filter(myFilterFunc); 

function myFilterFunc(val) { 
    if (elems.indexOf(val) > -1) return true; 
} 

Fiddle