如何在JavaScript中找到与布尔条件匹配的数组的第一个元素?
如何在JavaScript中找到与布尔条件匹配的数组的第一个元素?
我想知道是否有一种已知的、内置的/优雅的方法来找到符合给定条件的JS数组的第一个元素。C#中的等价方法是List.Find。\n到目前为止,我一直在使用以下两个函数的组合:\n// 返回满足给定条件的数组的第一个元素\nArray.prototype.findFirst = function (predicateCallback) {\n if (typeof predicateCallback !== \'function\') {\n return undefined;\n }\n for (var i = 0; i < arr.length; i++) {\n if (i in this && predicateCallback(this[i])) return this[i];\n }\n return undefined;\n};\n// 检查元素不是undefined && 不是null\nisNotNullNorUndefined = function (o) {\n return (typeof (o) !== \'undefined\' && o !== null);\n};\n然后我可以使用:\nvar result = someArray.findFirst(isNotNullNorUndefined);\n但由于ECMAScript中有如此多的函数式数组方法,也许已经有类似的东西了?我想象很多人都经常需要实现这样的东西...
在JavaScript中,有时我们需要找到数组中满足特定条件的第一个元素。下面是一些方法可以帮助我们实现这个目标。
第一种方法是使用filter
方法并从结果数组中获取第一个索引:
var result = someArray.filter(isNotNullNorUndefined)[0];
第二种方法是继续使用ES5的方法:
var result = someArray.filter(isNotNullNorUndefined).shift();
虽然我自己对上面的find答案进行了投票,但我认为通过使用ES6的解构语法,我们可以稍微改进一下:
var [result] = someArray.filter(isNotNullNorUndefined);
有人问到为什么在这里使用.shift()
有什么好处?使用shift()
的好处是它看起来很聪明,但实际上更令人困惑。谁会认为调用没有参数的shift()
与获取第一个元素是相同的呢?在我看来,这并不清楚。而且,数组访问速度更快:[jsperf.com/array-access-vs-shift](https://jsperf.com/array-access-vs-shift)。
此外,在ES5中,对象和数组都可以使用方括号表示法,我从来没有看到过明确说明使用.shift()
而不是[0]
的偏好。尽管如此,这是一个你可以选择使用或不使用的替代方法,但我倾向于使用[0]
。
以上是在JavaScript中找到数组中满足布尔条件的第一个元素的方法。希望对你有所帮助!
问题的出现原因:
该问题的出现是因为在JavaScript中,我们需要找到一个数组中满足某个布尔条件的第一个元素。但是在旧版本的浏览器(如Internet Explorer)中,没有原生的方法可以实现这个功能。
解决方法:
从ECMAScript 6开始,我们可以使用Array.prototype.find方法来解决这个问题。这个方法在Firefox(25.0),Chrome(45.0),Edge(12)和Safari(7.1)中都可以使用。但是在一些旧版本的浏览器或者不常见的平台上可能不支持。
如果想要立即使用这个方法但是需要支持IE或其他不支持的浏览器,可以使用一个shim(补丁)。推荐使用es6-shim,也可以在MDN上找到一个shim。为了最大的兼容性,建议使用es6-shim,因为它可以检测到有bug的原生实现并进行修复。
使用find方法比使用filter方法更好,因为find方法在找到满足条件的元素后会立即停止,而filter方法会遍历所有的元素并返回所有满足条件的元素。
问题的出现的原因是因为在JavaScript中,寻找数组中满足某个布尔条件的第一个元素并不是一个直接的操作。在ES6之前,没有原生的方法可以快速地找到这样的元素。这导致了一些开发者对于如何高效地寻找数组中第一个满足条件的元素感到困惑。
解决方法是使用find
方法,它是ES6引入的原生方法。这个方法会在找到第一个满足条件的元素后停止遍历,并返回该元素的值。以下是使用find
方法的示例代码:
const result = someArray.find(isNotNullNorUndefined);
在ES6之前,可以使用some
方法来遍历数组,直到满足条件为止(然后停止)。然而,some
方法只会返回条件是否满足,而不会返回满足条件的元素或其索引。为了解决这个问题,我们需要对some
方法进行一些修改,如下所示:
function find(arr, test, ctx) { var result = null; arr.some(function(el, i) { return test.call(ctx, el, i, arr) ? ((result = el), true) : false; }); return result; } var result = find(someArray, isNotNullNorUndefined);
有人可能会问为什么不直接使用filter
方法来解决这个问题。虽然filter
方法在大多数情况下是可行的,但它的效率相对较低。因为filter
方法会遍历整个数组,即使找到的值是集合中的第一个值。相比之下,some
方法会立即返回,所以在几乎所有情况下,some
方法比filter
方法更快。
总结一下,通过使用ES6的find
方法或者通过修改some
方法来寻找数组中第一个满足条件的元素,我们可以高效地解决这个问题。