Skip to content

根据条件从JavaScript数组的开头或结尾获取元素

我们之前已经介绍了如何获取JavaScript数组的前n个或后n个元素。这次,我们将看看如何根据给定条件从数组的开头或结尾获取元素。

在满足条件的情况下从数组开头获取元素

现代JavaScript充满了有用的数组方法,它们帮助我们避免编写for...of循环,我个人觉得这有点过时了。在我们要解决的问题的核心是一个非常简单的任务 - 找到数组中第一个不满足条件的元素的索引。这正是Array.prototype.findIndex()的用途。

找到索引后,我们可以使用Array.prototype.slice()从数组的开头获取元素直到该索引。不过,有一个小问题。如果数组中没有任何元素满足条件Array.prototype.findIndex()会返回-1。这意味着我们需要检查该值,并在这种情况下返回整个数组。

const takeWhile = (arr, fn) => {
  const index = arr.findIndex(n => !fn(n));
  return index === -1 ? arr : arr.slice(0, index);
};

takeWhile([1, 2, 3, 4], n => n < 0); // []
takeWhile([1, 2, 3, 4], n => n < 3); // [1, 2]
takeWhile([1, 2, 3, 4], n => n < 5); // [1, 2, 3, 4]

在满足条件的情况下从数组结尾获取元素

从数组结尾获取元素的方法非常类似。为了找到索引,我们将使用Array.prototype.findLastIndex()。此外,我们还需要将索引加1,以考虑Array.prototype.slice()的行为。

const takeRightWhile = (arr, fn) => {
  const index = arr.findLastIndex(n => !fn(n));
  return index === -1 ? arr : arr.slice(index + 1);
};

```javascript
takeRightWhile([1, 2, 3, 4], n => n > 5); // []
takeRightWhile([1, 2, 3, 4], n => n > 2); // [3, 4]
takeRightWhile([1, 2, 3, 4], n => n > 0); // [1, 2, 3, 4]

takeRightWhile函数接受一个数组和一个断言函数作为参数。它从数组的末尾开始遍历,直到找到第一个不满足断言函数的元素为止。然后返回从该元素到数组末尾的所有元素。

第一个例子中,数组[1, 2, 3, 4]中的所有元素都不满足断言函数n > 5,所以返回一个空数组[]

第二个例子中,数组[1, 2, 3, 4]中的最后两个元素34满足断言函数n > 2,所以返回[3, 4]

第三个例子中,数组[1, 2, 3, 4]中的所有元素都满足断言函数n > 0,所以返回整个数组[1, 2, 3, 4]