当前位置: 首页 > 面试题库 >

获取匹配条件的数组内对象的索引

顾昌翰
2023-03-14
问题内容

我有一个像这样的数组:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

如何在不迭代整个数组的情况下获取与条件匹配的对象的索引?

例如,给定prop2=="yutu",我想获取index 1

我看到了,.indexOf()但认为它用于类似的简单数组["a1","a2",...]。我也检查了一下,$.grep()但这返回了对象,而不是索引。


问题答案:

从2016年开始,您应该为此使用Array.findIndex(ES2015 /
ES6标准):

a = [

  {prop1:"abc",prop2:"qwe"},

  {prop1:"bnmb",prop2:"yutu"},

  {prop1:"zxvz",prop2:"qwrq"}];



index = a.findIndex(x => x.prop2 ==="yutu");



console.log(index);

Google Chrome,Firefox和Edge支持该功能。对于Internet Explorer,在链接页面上有一个polyfill。

性能说明

函数调用是昂贵的,因此对于非常大的数组,简单的循环将比findIndex

let test = [];



for (let i = 0; i < 1e6; i++)

    test.push({prop: i});





let search = test.length - 1;

let count = 100;



console.time('findIndex/predefined function');

    let fn = obj => obj.prop === search;



    for (let i = 0; i < count; i++)

        test.findIndex(fn);

console.timeEnd('findIndex/predefined function');





console.time('findIndex/dynamic function');

    for (let i = 0; i < count; i++)

        test.findIndex(obj => obj.prop === search);

console.timeEnd('findIndex/dynamic function');





console.time('loop');

    for (let i = 0; i < count; i++) {

        for (let index = 0; index < test.length; index++) {

            if (test[index].prop === search) {

                break;

            }

        }

    }

console.timeEnd('loop');

与大多数优化一样,应谨慎且仅在实际需要时才应用此优化。



 类似资料:
  • 为什么我不能得到数组中给定对象的索引? 期望的结果显然是2…

  • 我有一个2D按钮数组(按钮),它将生成一个5×5的按钮网格。我想在单击时获取单个按钮的索引(例如,(2,2)在中间),并通过创建Topcenter(这将是按钮的索引(x,y-1)或1,2,其中x和y是单击按钮的值)等整数变量,在3 x 3半径内找到围绕原始按钮的按钮的索引值。)然后,我可以向周围的按钮添加文本等。 这是一个可视化: 0,0|0,1|0,2|0,3|0,4 1,0 | 1,1 | 1

  • 我在Sybase数据库中有一个表,其中有一列is_req。它的数据类型是char(1)。它在我的hbm文件中的属性定义如下: 属性名称="is必需"列="is_req"类型="boolean" 现在,当我尝试使用标准/限制进行比较时,比如:,我得到以下例外: 如果我尝试做,我得到以下异常: com.sybase.jdbc2.jdbc.SybSQLException:不允许从数据类型'VARCHAR

  • 问题内容: 我想以jQuery或纯JavaScript的形式获取JavaScript对象的键作为数组。 有没有比这更详细的方法? 问题答案: 用途: 这是ES5的功能。这意味着它可以在所有现代浏览器中使用,但不能在旧版浏览器中使用。 ES5-shim有一个实现可以偷

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

  • 任务: 有3个endpoint: 第一个返回请求的随机数据到另外两个endpoint。 另外两个endpoint使用不同的DBs操作,但或多或少使用相似的数据。 我需要验证来自一个endpoint的响应是否匹配来自另一个endpoint的响应,两个endpoint发送相同的数据,但顺序不同。 例如。: endpoint“A”: endpoint“B”: endpointA_response.ite