如何提取数组中间项(偶数取两项)?无需条件语句且避免返回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
相关产品推荐
相关产品推荐

