根据条件从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]
中的最后两个元素3
和4
满足断言函数n > 2
,所以返回[3, 4]
。
第三个例子中,数组[1, 2, 3, 4]
中的所有元素都满足断言函数n > 0
,所以返回整个数组[1, 2, 3, 4]
。