获取偶数数组中的中间两项

问题描述 投票:0回答:5

所以我需要返回数组的中间项(如果有奇数个项),非常简单:

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) {

}
javascript arrays
5个回答
4
投票

逻辑很简单:

  • 如果数组为空,则不返回任何内容
  • 如果数组有奇数个项目,则中间项目的索引就是
    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


1
投票

您可以设置一个双移,它返回一个整数值,检查长度是否为奇数,然后取中间索引,否则对数组进行切片并获取两个中间元素。

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]));


0
投票

从奇数数组中获取中间值:

const middle = Math.floor(arr.length / 2);

要从偶数数组中获取中间 2 个值:

const midPoint = arr.length / 2;
const middle2 = [arr[midPoint - 1], arr[midPoint]];

0
投票

我认为可以使用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));


0
投票

我的答案比所选答案稍微简单,因为它避免了条件以及下限和上限函数。本质上,它利用模函数,如果数组长度为偶数,则加 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

© www.soinside.com 2019 - 2024. All rights reserved.