所以我需要返回数组的中间项(如果有奇数个项),非常简单:
function middleItem(oddArr) {
let count = 0;
if (arr.length % 2 !== 0) {
for (i = 0; i < arr.length; i++) {
arr[i] === arr[(arr.length - 1) / 2] && (count = arr[i]);
}
}
return count
}
但是当涉及到从偶数个项目的数组中返回中间两个项目时,我开始失去理智,哈哈。我搜索了 2 个小时但没有找到答案(我需要提高我的逻辑),但现在我很想知道你们认为最好的方法是什么。 非常感谢!
function middleItem(evenArr) {
}
逻辑很简单:
Math.floor(arr.length / 2)
arr.length / 2 - 1
和 arr.length / 2
参见概念验证示例:
function middleItem(arr) {
if (!arr.length)
return;
const mid = arr.length / 2;
if (arr.length % 2 === 1) {
return arr[Math.floor(mid)];
} else {
return [
arr[mid - 1],
arr[mid],
];
}
}
console.log(middleItem([])); // undefined
console.log(middleItem([0])); // 0
console.log(middleItem([0,1])); // [0, 1]
console.log(middleItem([0,1,2])); // 1
console.log(middleItem([0,1,2,3])); // [1, 2]
console.log(middleItem([0,1,2,3,4])); // 2
您可以设置一个双移,它返回一个整数值,检查长度是否为奇数,然后取中间索引,否则对数组进行切片并获取两个中间元素。
function getMiddle(array) {
const middle = array.length >> 1;
return array.length & 1
? array[middle]
: array.slice(middle - 1, middle + 1);
}
console.log(getMiddle([1, 2, 3, 4, 5]));
console.log(getMiddle([1, 2, 3, 4, 5, 6]));
从奇数数组中获取中间值:
const middle = Math.floor(arr.length / 2);
要从偶数数组中获取中间 2 个值:
const midPoint = arr.length / 2;
const middle2 = [arr[midPoint - 1], arr[midPoint]];
我认为可以使用Math.floor和Math.ceil - 但是偶数必须变成奇数才能得到两个不同的值。因此 - Math.floor(4/2) 和 Math.ceil(4/2) 都会返回 2,但 Math.floor((4+1)/2) 和 Math.ceil((4+1)/2)将返回 2 和 3。如果数字是奇数,我们将返回两个值相同的状态。因此,我们可以为此编写代码并对数组进行切片:
let arr = [1, 2, 3, 4, 5, 6];
let arr2 = [1, 2, 3, 4, 5];
let arr3 = [1, 2, 3, 4, 5, 6, 8, 10, 12, 14];
let arr4 = [1, 2, 3, 4, 5, 7, 0];
let arr5 = [1, 2, 3, 4, 5, 3];
function middleItem(a) {
let middle1 = Math.floor((a.length + 1) / 2);
let middle2 = Math.ceil((a.length + 1) / 2);
return a.slice(middle1 - 1, middle2);
}
console.log(arr + " > " + middleItem(arr));
console.log(arr2 + " > " + middleItem(arr2));
console.log(arr3 + " > " + middleItem(arr3));
console.log(arr4 + " > " + middleItem(arr4));
console.log(arr5 + " > " + middleItem(arr5));
我的答案比所选答案稍微简单,因为它避免了条件以及下限和上限函数。本质上,它利用模函数,如果数组长度为偶数,则加 1 以获得上限,如果数组长度为奇数,则加 0。下限范围通过除以 2 或移位一次来计算。
function middleItem(arr) {
if (!arr.length)
return;
const mid1 = (arr.length + 1) >> 1; // optional can use divide by 2.
const mid2 = mid1 + ((arr.length + 1) % 2);
return arr.slice(mid1 - 1, mid2);
}
console.log(middleItem([])); // undefined
console.log(middleItem([0])); // 0
console.log(middleItem([0, 1])); // [0, 1]
console.log(middleItem([0, 1, 2])); // 1
console.log(middleItem([0, 1, 2, 3])); // [1, 2]
console.log(middleItem([0, 1, 2, 3, 4])); // 2