如何提取数组的偶数元素?

时间:2011-08-30 12:47:07

标签: javascript arrays

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

我已尝试此代码以输出数组的偶数(索引)元素。它有效,但它也输出一些空元素。如何修复此代码以仅输出现有元素?

8 个答案:

答案 0 :(得分:19)

使用模数:

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开始循环。

答案 1 :(得分:14)

对于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;
  };
}

答案 2 :(得分:2)

为什么不尝试使用%运算符。它为你提供剩下的分工。

替换循环块
if ((i % 2) === 0) {
    ar.push(a[i])
}

答案 3 :(得分:1)

这适用于2018年:)

取奇数索引并申请过滤

&#13;
&#13;
var arr = [4, 5, 7, 8, 14, 45, 76,5];
let filtered=arr.filter((a,i)=>i%2===1);
console.log(filtered);
&#13;
&#13;
&#13;

答案 4 :(得分: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是模运算符,它返回整数除法的余数。

答案 5 :(得分: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));

答案 6 :(得分:0)

我只想解释为什么你的结果不符合你的预期,因为其他人都展示了出色的解决方案。您正在迭代数组大小N,因此生成的数组将尝试推送数组中的元素,这将导致大小为N.由于在原始数组中只能找到N / 2,因此生成的数组将填充其余的空白以填充在N的其余部分中。因此,如果您检查是否存在[2 * i]或在插入之前检查是否[i]%2 == 0,则生成的数组将仅包含偶数索引值

答案 7 :(得分:0)

即使这个问题很老,我也想添加一个单行过滤器:
奇数:arr.filter((e,i)=>i%2)
偶数:arr.filter((e,i)=>i%2-1)
偶数的更“合法”方式:arr.filter((e,i)=>!(i%2))

就像sumit所说的那样,不需要检查i%2===1;由于mod 2已经以数字形式返回0或1,因此在js中可以将它们解释为布尔值。