【问题标题】:How to search for multiple index(es) of same values in javascript array如何在javascript数组中搜索相同值的多个索引
【发布时间】:2014-06-16 10:20:58
【问题描述】:

我有一个一维数组,例如:

var abc = ['a','a','b','a','c']

现在我想取回'a'的所有索引,即0、1和3。

有没有简单的解决方案?

附言

我知道IndexOfjQuery.inArray()。但是他们只返回了第一个匹配元素的索引

【问题讨论】:

标签: javascript arrays


【解决方案1】:

当您传递的函数返回 undefined 时,您可以利用 $.map() 不会将值推送到其结果数组中这一事实。

因此,你可以这样写:

var abc = ["a", "a", "b", "a", "c"];
var indices = $.map(abc, function(element, index) {
    if (element == "a") {
        return index;
    }
});

【讨论】:

    【解决方案2】:

    您可以使用 Array#reduceArray#concat 来检查想要的项目,获取索引或空数组。

    var abc = ['a', 'a', 'b', 'a', 'c'],
        indices = abc.reduce((r, v, i) => r.concat(v === 'a' ? i : []), []);
    
    console.log(indices);

    ES5

    var abc = ['a', 'a', 'b', 'a', 'c'],
        indices = abc.reduce(function (r, v, i) {
            return r.concat(v === 'a' ? i : []);
        }, []);
    
    console.log(indices);

    【讨论】:

      【解决方案3】:

      除了使用 for 循环之外,您还可以使用 while 循环与 indexOf 结合使用:

      var array = [1, 2, 3, 4, 2, 8, 5],
          value = 2,
          i = -1,
          indizes = [];
      
      while((i = array.indexOf(value, i + 1)) !== -1) {
          indizes.push(i);
      }
      

      这将返回您[1, 4],当然可以与扩展Array 的原型相结合。

      indexOf 的第二个参数指定在给定数组中从何处开始搜索。

      【讨论】:

        【解决方案4】:

        您可以使用以下方法扩展基本的Array Object

        Array.prototype.multiIndexOf = function (el) { 
            var idxs = [];
            for (var i = this.length - 1; i >= 0; i--) {
                if (this[i] === el) {
                    idxs.unshift(i);
                }
            }
            return idxs;
        };
        

        然后操作

        var abc = ['a','a','b','a','c'];
        abc.multiIndexOf('a');
        

        会给你结果:

        [0, 1, 3]
        

        Jsperf comparison unshift / push / push(倒序)

        【讨论】:

          【解决方案5】:

          您还可以在数组上使用 reduce 函数并将索引推送到累积数组,您需要从一个空数组开始,reduce 的好处是它是异步的,而且执行时间比 for 快循环,也是数组的原生函数,看看下面,希望对你有帮助:

           var arr = [0, 1, 2, 3, 7, 2, 3, 4, 7, 8, 9, 2, 3];
          
                      function indexesOf(num) {
                          var reduced = arr.reduce(function(acc, val, ind, arr){
                            if(val === num){
                              acc.push(ind);
                            } 
                            return acc;
                          }, []);
                          return reduced;
                      }
          
          indexesOf(2); //[2, 5, 11]
          

          【讨论】:

            【解决方案6】:

            AFAIK,没有 Javascript 或 jQuery 函数可以一步完成,你必须编写一个循环。

            var indexes = [];
            $.each(abc, function(i, val) {
                if (val == "a") {
                    indexes.push(i);
                }
            }
            

            【讨论】:

              【解决方案7】:

              这样做:

              var abc = ['a','a','b','a','c'];

              for (var i=0; i<abc.length; i++) {if(abc[i]=='a') {console.log(i)};}

              【讨论】:

                【解决方案8】:

                Demo 使用for循环

                 var arr = ['a', 'a', 'b', 'a', 'c'];
                
                var indexA = [];
                for (var i = 0; i < arr.length; i++) {
                
                    if ("a" == arr[i]) indexA.push(i)
                }
                

                【讨论】:

                  【解决方案9】:

                  如果您的数组大小是固定的,那么您可以使用indexOf() 找到数组中的第一个匹配项。使用找到的索引值作为indexOf() 中的起点来查找其他事件。

                  var firstOccurance = [your_array].indexOf(2)
                  var secondOccurance = [your_array].indexOf(2, firstOccurance + 1)
                  

                  【讨论】:

                    【解决方案10】:

                    使用 ES6 语法,您可以使用 forEach 和三元运算符:

                    const abc = ['a','a','b','a','c']
                    let matchingIndexes = []
                    abc.forEach( (currentItem, index) => {
                         currentItem === 'a' ? matchingIndexes.push(index) : null
                    })
                    console.log(matchingIndexes) // [0, 1, 3]
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-07-10
                      • 1970-01-01
                      相关资源
                      最近更新 更多