You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取数组中间项(偶数取两项)?无需条件语句且避免返回Undefined

获取数组中间项的需求

我从奇数长度的数组中提取中间项时:

var givenArray = ['Maths','English', 'Social', 'Economics','Tech']
console.log(givenArray[((givenArray.length-1)/2)])

得到的输出是Social,符合预期;但处理偶数长度的数组时:

var givenArray = ['Maths','English', 'Social', 'Economics']
console.log(givenArray[((givenArray.length)/2)])

得到的输出是Social。

我需要实现:无论数组长度为奇数还是偶数,都能获取中间项(奇数取1项,偶数取2项),且不会返回Undefined。我可以用条件语句实现,但不想这么做,请问有没有其他方法?

备注:我是JavaScript初学者。


解决方案

可以直接用数组的slice()方法来实现,不用写if-else这类条件判断,代码简洁还符合需求,对初学者也友好:

function getMiddleItems(arr) {
  const startIndex = Math.floor((arr.length - 1) / 2);
  const endIndex = Math.ceil((arr.length + 1) / 2);
  return arr.slice(startIndex, endIndex);
}

// 测试奇数长度数组
const oddLengthArr = ['Maths','English', 'Social', 'Economics','Tech'];
console.log(getMiddleItems(oddLengthArr)); // 输出: ['Social']

// 测试偶数长度数组
const evenLengthArr = ['Maths','English', 'Social', 'Economics'];
console.log(getMiddleItems(evenLengthArr)); // 输出: ['English', 'Social']

简单解释下逻辑:

  • 针对奇数长度的数组(比如长度5):
    startIndex算出来是2,endIndex是3,slice(2, 3)会截取数组中索引从2到3(不包含3)的元素,也就是刚好中间的那1项。
  • 针对偶数长度的数组(比如长度4):
    startIndex是1,endIndex是3,slice(1, 3)会截取索引1和2的元素,也就是中间的2项。
  • 另外slice()方法很安全,就算你传入的endIndex超出数组长度,它也只会截取到数组最后一个元素,绝对不会返回undefined,完美满足你的要求。

如果想写得更简洁,还可以用位运算简化计算(不过初学者先理解上面的写法就好):

function getMiddleItems(arr) {
  const mid = (arr.length - 1) >> 1; // 等价于Math.floor((arr.length - 1)/2)
  return arr.slice(mid, mid + 1 + (arr.length % 2 === 0 ? 1 : 0));
}

内容的提问来源于stack exchange,提问作者user20816962

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:57:25