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
我已尝试此代码以输出数组的偶数(索引)元素。它有效,但它也输出一些空元素。如何修复此代码以仅输出现有元素?
答案 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年:)
取奇数索引并申请过滤
var arr = [4, 5, 7, 8, 14, 45, 76,5];
let filtered=arr.filter((a,i)=>i%2===1);
console.log(filtered);
&#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中可以将它们解释为布尔值。