如何在javascript数组中搜索相同值的多个索引

时间:2014-06-16 10:20:58

标签: javascript jquery arrays

我有一个一维数组,如:

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

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

有没有简单的解决方案?

P.S。

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

10 个答案:

答案 0 :(得分:6)

您可以使用以下方法扩展基本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(逆序)

答案 1 :(得分:2)

您可以使用与indexOf组合的while循环:

,而不是使用for循环
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的第二个参数指定在给定数组中开始搜索的位置。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这样做:

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

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

答案 4 :(得分:1)

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

因此,你可以写:

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

答案 5 :(得分:1)

你也在数组上使用 reduce 函数并将索引推送到累积数组,你需要从一个空数组开始,关于reduce的好处是它是异步的,而且时间执行比循环,它也是数组上的本机函数,请看下面的内容,希望它有所帮助:

 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 :(得分:0)

<强> Demo 用于循环

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

var indexA = [];
for (var i = 0; i < arr.length; i++) {

    if ("a" == arr[i]) indexA.push(i)
}

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

你可以使用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);

答案 9 :(得分:0)

使用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]