当前位置: 首页 > 知识库问答 >
问题:

如何在JavaScript中找到匹配布尔条件的数组的第一个元素?

谢旭
2023-03-14

我想知道是否有一种已知的、内置的/优雅的方法来查找匹配给定条件的JS数组的第一个元素。C#的等价物将是list.find。

到目前为止,我一直在使用这样的两个功能组合:

// Returns the first element of an array that satisfies given predicate
Array.prototype.findFirst = function (predicateCallback) {
    if (typeof predicateCallback !== 'function') {
        return undefined;
    }

    for (var i = 0; i < arr.length; i++) {
        if (i in this && predicateCallback(this[i])) return this[i];
    }

    return undefined;
};

// Check if element is not undefined && not null
isNotNullNorUndefined = function (o) {
    return (typeof (o) !== 'undefined' && o !== null);
};

然后我可以使用:

var result = someArray.findFirst(isNotNullNorUndefined);

但是由于ECMAScript中有这么多函数式数组方法,也许已经有类似的东西了?我想很多人都要一直在做这样的事情...

共有1个答案

微生翼
2023-03-14

从ES6开始,就有用于数组的本机find方法;一旦找到第一个匹配项并返回值,就停止枚举数组。

const result = someArray.find(isNotNullNorUndefined);

老答:

我必须发布一个答案来停止这些过滤器建议:-)

既然ECMAScript中有这么多函数式数组方法,也许已经有类似的东西了?

您可以使用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);
 类似资料:
  • 我想知道是否有一种已知的、内置的/优雅的方法来查找匹配给定条件的JS数组的第一个元素。C#的等价物将是list.find。 到目前为止,我一直在使用这样的两个功能组合: 然后我可以使用: 但是由于ECMAScript中有这么多函数式数组方法,也许已经有类似的东西了?我想很多人都要一直在做这样的事情...

  • 从一个布尔数组中找到第i个布尔值,例如:数组是{true, true, false, false, true},该方法将输出int,显示第3个true值,即4。 我已经尝试过一些代码,它可以工作,但我需要使用递归,而不是while函数。

  • 如何在流中获得第一个匹配条件的元素?我试过了,但不起作用 如果条件不起作用,则在Stop以外的其他类中调用filter方法。

  • 我已经制作了一个带有几何图形和for循环的表格,用于打印出直角图形的名称,但我想为这个图形打印一个符合条件的随机名称,如果可能的话,还可以创建另一个表格,其中只包含符合条件的图形。我试图使用,但我不知道怎么做。我将感谢你的帮助:

  • 这不是我写过的最糟糕的代码,但也不是很好。它也不是那么灵活,因为它依赖于一个映射函数到一个带有函数的类型,该函数描述了您要查找的属性;我更希望有一个可以用于任意的东西 有人知道怎么做吗?

  • 问题内容: 我有两个数组,我希望能够比较两个数组,只返回匹配的值。例如,两个数组都具有值,因此将返回该值。我还没找到这样的东西。返回相似度的最佳方法是什么? 问题答案: 自然,我的方法是循环遍历第一个数组一次并检查第二个数组中每个值的索引。如果索引为,则将其添加到返回的数组中。 我的解决方案不像其他循环那样使用两个循环,因此它的运行速度可能会更快一些。如果要避免使用,则可以先对两个数组进行排序,以