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
我尝试了这段代码,以便输出数组的偶数(索引)元素。它可以工作,但它也会输出一些空元素。如何修复此代码以仅输出现有元素?
使用模数:
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
开始循环。
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;
};
}
这将在 2018 年有效:)
取奇数索引并应用于过滤器
var arr = [4, 5, 7, 8, 14, 45, 76, 5];
let filtered = arr.filter((a,i) => i%2===1);
console.log(filtered);
即使这个问题很老了,我也想添加一个单行过滤器:
奇数:
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 位整数。
为什么不尝试使用 % 运算符呢?它为您提供了剩余的除法。
将循环块替换为
if ((i % 2) === 0) {
ar.push(a[i])
}
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));
我只是想解释为什么你的结果不是你所期望的,因为其他人都展示了出色的解决方案。您正在迭代大小为 N 的数组,因此生成的数组将尝试将元素推入数组中,从而生成大小为 N 的数组。由于在原始数组中只能找到 N/2,因此生成的数组将用空白填充其余部分。因此,如果您在插入之前检查 a[2*i] 是否存在或检查 a[i] % 2 == 0 是否存在,则结果数组将仅包含偶数索引值