2011-08-30 66 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