在一个数组中找到第一个非零值的索引

6

我有一个数组的数组:

[
    [0,0],
    [0,0],
    [3,2],
    [5,6],
    [15,9],
    [0,0],
    [7,23],
]

我可以使用.indexOf(0)来查找第一个零值索引,但如果我要查找第一个非零值的索引或符合某些条件的索引,该怎么办?
可能会像.indexOf(function(val){ return val[0] > 0 || val[1] > 0;})这样,但这种方法不被支持。
我该如何以最优雅的方式解决这个问题?

如果我理解正确,根据您的示例,答案应该是2? - Xartok
你可以在回调函数中使用 Array#some 来产生副作用并给出索引。 - Xartok
1
ES6 提供了 findIndex 方法。 - hindmost
1个回答

13

如何用最优雅的方式解决这个问题?

最佳解决方案是使用原生的ES6数组方法.findIndex(或Lodash/Underscore的_.findIndex)。

var index = yourArr.findIndex(val=>val[0] > 0 || val[1] > 0)

这段代码使用了ES6箭头函数,等价于:

var index = yourArr.findIndex(function (val) {
  return val[0] > 0 || val[1] > 0;
});

当然,您可以使用.some方法来检索索引,但这种解决方案并不优雅。

有关.find.findIndex和箭头函数的更多参考信息:

如果没有Array#findIndex,您可能需要进行Shim操作,但这很容易完成。


2
“如何找到第一个非零值的索引?” -> 应该使用.findIndex()而不是.find() - Andreas
没有必要指出 some 不够优雅。同样也可以指出 forEachreduce 和简单的循环等等。 - T.J. Crowder
@Andreas:糟糕!应该是“findIndex”,而不是“find”。 - T.J. Crowder
@T.J.Crowder,目前似乎还没有广泛支持findIndex方法。你可以参考这个链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex。我希望你能恢复你的答案,因为它符合es5标准并且非常优雅。 - AmmarCSE
2
@AmmarCSE:确实支持还不广泛,但很容易使用 Array#some 进行 shim,并且它正好适用于这个用例,所以... - T.J. Crowder
嘿!我忘记了那种不错的小技巧 :) - AmmarCSE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接