如何在数组中找到所有元素出现的索引?

 南京展鸿物流_728 发布于 2023-02-07 20:32

我试图在JavaScript数组中找到元素的所有实例的索引,比如"Nano".

var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];

我尝试了jQuery.inArray,或类似地,.indexOf(),但它只给出了元素的最后一个实例的索引,即在这种情况下为5.

我如何获得所有实例?

6 个回答
  • .indexOf()方法有一个可选的第二个参数,它指定开始搜索的索引,因此您可以在循环中调用它以查找特定值的所有实例:

    function getAllIndexes(arr, val) {
        var indexes = [], i = -1;
        while ((i = arr.indexOf(val, i+1)) != -1){
            indexes.push(i);
        }
        return indexes;
    }
    
    var indexes = getAllIndexes(Cars, "Nano");
    

    你没有真正说明你想如何使用索引,所以我的函数将它们作为一个数组返回(如果找不到值,则返回一个空数组),但是你可以用单独的索引值做其他事情.在循环内.

    更新:根据VisioN的评论,一个简单的for循环可以更有效地完成相同的工作,并且更容易理解,因此更容易维护:

    function getAllIndexes(arr, val) {
        var indexes = [], i;
        for(i = 0; i < arr.length; i++)
            if (arr[i] === val)
                indexes.push(i);
        return indexes;
    }
    

    2023-02-07 20:33 回答
  • 另一种替代解决方案是使用Array.prototype.reduce():

    ["Nano","Volvo","BMW","Nano","VW","Nano"].reduce(function(a, e, i) {
        if (e === 'Nano')
            a.push(i);
        return a;
    }, []);   // [0, 3, 5]
    

    注意:检查方法的浏览器兼容性,reduce并根据需要使用polyfill.

    2023-02-07 20:33 回答
  • 使用Array.prototype.map()和Array.prototype.filter()的另一种方法:

    var indices = array.map((e, i) => e === value ? i : '').filter(String)
    

    2023-02-07 20:35 回答
  • 注意:MDN提供了一个使用while循环的方法:

    var indices = [];
    var array = ['a', 'b', 'a', 'c', 'a', 'd'];
    var element = 'a';
    var idx = array.indexOf(element);
    while (idx != -1) {
      indices.push(idx);
      idx = array.indexOf(element, idx + 1);
    }
    

    我不会说这比其他答案更好。真有趣。

    2023-02-07 20:35 回答
  • 您可以使用map和编写一个简单易读的解决方案filter

    const nanoIndexes = Cars
      .map((car, i) => car === 'Nano' ? i : -1)
      .filter(index => index !== -1);
    

    编辑:如果您不需要支持IE / Edge(或正在转译您的代码),则ES2019给了我们flatMap,它使您能够以一种简单的方式进行此操作:

    const nanoIndexes = Cars.flatMap((car, i) => car === 'Nano' ? i : []);
    

    2023-02-07 20:35 回答
  • es6样式的更简单方法。

    const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);
    
    
    //Examples:
    var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
    indexOfAll(cars, "Nano"); //[0, 3, 5]
    indexOfAll([1, 2, 3, 1, 2, 3], 1); // [0,3]
    indexOfAll([1, 2, 3], 4); // []
    

    2023-02-07 20:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有