2011-08-30 67 views
13
var arr = [4, 5, 7, 8, 14, 45, 76]; 

function even(a) { 
    var ar = []; 

    for (var i = 0; i < a.length; i++) { 
    ar.push(a[2 * i + 1]); 
    } 

    return ar; 
} 

alert(even(arr)); 

http://jsbin.com/unocar/2/edit如何提取數組的元素?

我們爲了陣列的輸出,即使(指數)元素嘗試這種代碼。它可以工作,但它也輸出一些空的元素。我如何修復這段代碼以僅輸出現有的元素?

回答

14

要麼使用彈性模量:

for (var i = 0; i < a.length; i++) { 
    if(i % 2 === 0) { // index is even 
     ar.push(a[i]); 
    } 
} 

或通過遞增i相應地跳過每第二個元件:

for(var i = 0; i < a.length; i += 2) { // take every second element 
    ar.push(a[i]); 
} 

說明:你的代碼實際上需要與奇數索引的元素從所述陣列。如果這是您想要的,則必須分別使用i % 2 === 1或使用var i = 1開始循環。

+0

大概,我說錯了。我的意思是序數的元素 - 例如,5是第二,8是第四等.. – DrStrangeLove

+0

我看...那麼它應該工作,如果你採取奇怪的指標。 –

+0

從第二個元素開始: for(var i = 1; – DruDro

2

你爲什麼不試試用%運算符。它給你剩下的一個部門。

if ((i % 2) === 0) { 
    ar.push(a[i]) 
} 
0

取代環塊您需要測試均勻性的元素是這樣的:

var arr = [4,5,7,8,14,45,76]; 

function even(a){ 
    var ar = []; 

    for (var i=0; i<a.length;i++){ 
    if (a[i] % 2 === 0) 
    { 
     ar.push(a[i]); 
    } 

    } 

return ar; 
} 

alert(even(arr)); 

%2是模運算符,它返回整數除法的餘數。

+0

回答了錯誤的問題,對此表示遺憾 – jkebinger

0
var arr = [4,5,7,8,14,45,76]; 

function even(a) 
{ 
    var ar = []; 

    for (x in a) 
    { 

    if((a[x]%2)==0) 
    ar.push(a[x]); 

    } 
return ar; 
} 

alert(even(arr)); 
+1

不建議使用'for ... in'來遍歷數組,請參見https:// developer。 mozilla.org/en/JavaScript/Reference/Statements/for...in –

+0

@Felix Kling:對不起..我不知道那.. .. :)感謝您的鏈接 – mithunsatheesh

+0

沒問題,歡迎您:) –

9

對於IE9 +使用Array.filter

var arr = [4,5,7,8,14,45,76]; 
var filtered = arr.filter(function(element, index, array) { 
    return (index % 2 === 0); 
}); 

隨着舊的IE的回退,其他所有的瀏覽器都確定沒有此回退

if (!Array.prototype.filter) 
{ 
    Array.prototype.filter = function(fun /*, thisp */) 
    { 
    "use strict"; 

    if (this === void 0 || this === null) 
     throw new TypeError(); 

    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") 
     throw new TypeError(); 

    var res = []; 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in t) 
     { 
     var val = t[i]; // in case fun mutates this 
     if (fun.call(thisp, val, i, t)) 
      res.push(val); 
     } 
    } 

    return res; 
    }; 
} 
0

我只是想解釋一下爲什麼你的結果是不是你所期望的,因爲其他人都顯示出優秀的解決方案您正在遍歷數組大小爲N,因此您的結果數組將嘗試推送數組中的元素,這會導致大小N.由於在原始數組中只會找到N/2個數,因此您的結果數組將填充空白以填充在N的其餘部分。因此,如果您檢查是否存在[2 * i],或者在插入之前檢查[i]%2 == 0,則結​​果數組將僅包含偶數索引值

3

它會增加eltuza回答:

[1,2,3,4,5].filter(function(num){ if(num % 2) return num;}) 
+0

This答案並不完全回答這個問題。 – A1rPun