【问题标题】:Better way to find if item exists in JS array查找项目是否存在于 JS 数组中的更好方法
【发布时间】:2017-02-09 17:20:59
【问题描述】:

我有一个包含超过 10 000 个值的数组,并且不知何故 lodash 方法 includes 停止工作。

数组示例:

  ['888888111118888',
  '7771117717717771']

我的方法(不工作)但昨天也工作了(数组中的值数量较少)

toFind = '7771117717717771'; // this is just for example
return _.includes(arr, toFind);

无论toFind 是否在数组中,该方法都会返回“false”。有什么建议吗?

编辑

这就是我现在注意到的:

        console.log(data.memberList.members[0].steamID64[7]);
        toFind = data.memberList.members[0].steamID64[7];
        console.log(_.findIndex(data.memberList.members[0].steamID64, toFind));

它会回复:

999999999999
-1

那么这怎么可能呢?

【问题讨论】:

  • 这可能是一个错字,但在您的示例中,数组包含字符串,toFind 是一个数字。
  • 就像我之前所说的,这只是一个例子,toFind 与对象元素的表达式完全相同
  • 如果您提供示例,请确保它们反映您所拥有的。你不能在不工作的代码上挥手致意,并期望我们知道哪些错误是真实的,哪些不是。使示例以与当前代码相同的方式精确失败。
  • 谢谢,修正了所有的错别字!
  • Array.prototype.findIndex 有什么问题吗?它为您提供匹配的索引,因此您可以进行 O(1) 查找。你可以匹配任何东西,例如findIndex ( x => return x.someval === 'whatever' ),它返回索引或 -1 然后你只需执行 myArr [ theIndex ]。

标签: javascript arrays object lodash


【解决方案1】:

Array.prototype.findIndex 示例:

let arr = [ "123", "456" ];
let index = arr.findIndex ( x => { return x === "123" } );

这将返回 0(“123”的第一个索引)。如果你有对象:

let arr = [ { val : "123" }, { val : "456" } ];
let index = arr.findIndex ( x => { return x.val === "123" } );

等等。如果你得到 -1,要么你的匹配器是错误的,要么它不在数组中。

我非常尊重 lodash,但随着我们越来越多的原生功能(例如地图、集合)以及其他功能性更高阶的功能(过滤器、地图、reduce、findIndex 等),我发现了我对它的使用递减。

【讨论】:

    【解决方案2】:

    Array.prototype.find

    let result = arr.find(r => r ==='7771117717717771');
    

    如果定义了结果,则它存在于数组中。如果您正在寻找运行速度快于 O(n) 时间的操作,您应该研究替代数据结构,例如地图或树

    【讨论】:

    • 返回“7771117717717771”的不是函数。
    • 也返回 undefined
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2019-05-27
    • 2018-12-24
    相关资源
    最近更新 更多