如何提取数组中偶数索引的元素?

问题描述 投票:0回答:7
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

我尝试了这段代码,以便输出数组的偶数(索引)元素。它可以工作,但它也会输出一些空元素。如何修复此代码以仅输出现有元素?

javascript arrays
7个回答
35
投票

使用模数:

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]);
}

注意: 您的代码实际上从数组中获取具有 odd 索引的元素。如果这是您想要的,则必须分别使用

i % 2 === 1
或使用
var i = 1
开始循环。


20
投票

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

17
投票

这将在 2018 年有效:)

取奇数索引并应用于过滤器

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


7
投票

即使这个问题很老了,我也想添加一个单行过滤器:
奇数:

arr.filter((e,i)=>i%2)

偶数:
arr.filter((e,i)=>i%2-1)

偶数的更“合法”方式:
arr.filter((e,i)=>!(i%2))

没有必要像sumit所说的那样与

===1
核实。
mod 2
已经返回0或1,你可以让它们被解释为布尔值。

您可以使用

i&1
代替
i%2
,虽然它有利于大数组的性能,但它只能用于 31 位整数。


3
投票

为什么不尝试使用 % 运算符呢?它为您提供了剩余的除法。

将循环块替换为

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

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));

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.