web-dev-qa-db-fra.com

Comment trouver l'index de toutes les occurrences d'élément dans un tableau?

J'essaie de trouver l'index de toutes les instances d'un élément, disons "Nano", dans un tableau JavaScript.

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

J'ai essayé jQuery.inArray ou, de la même manière, .indexOf () , mais il n'a donné que l'indice de la dernière instance de l'élément, c'est-à-dire 5 dans ce cas.

Comment puis-je l'obtenir pour toutes les instances?

70
norbdum

La méthode .indexOf() possède un deuxième paramètre facultatif qui spécifie l'index à partir duquel effectuer la recherche. Vous pouvez donc l'appeler en boucle pour rechercher toutes les occurrences d'une valeur particulière:

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");

Vous ne précisez pas vraiment comment vous voulez utiliser les index, alors ma fonction les renvoie sous forme de tableau (ou retourne un tableau vide si la valeur n'est pas trouvée), mais vous pouvez faire autre chose avec les valeurs d'index individuelles. dans la boucle.

MISE À JOUR: Selon le commentaire de VisioN, une simple boucle for effectuerait le même travail plus efficacement, ce qui est plus facile à comprendre et donc plus facile à gérer:

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

Une autre solution consiste à utiliser 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]

N.B .: Vérifiez la méthode de compatibilité du navigateur pour la méthode reduce et utilisez polyfill si nécessaire.

51
VisioN

Une autre approche utilisant Array.prototype.map () et Array.prototype.filter () :

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

Remarque: MDN donne une méthode en utilisant une boucle 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);
}

Je ne dirais pas que c'est mieux que d'autres réponses. Juste intéressant.

3
abalter

Manière plus simple avec le style 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); // []
2
Alex Petre
const indexes = cars
    .map((car, i) => car === "Nano" ? i : null)
    .filter(i => i !== null)
1
Michael Pearson

Cela a fonctionné pour moi:

let array1 = [5, 12, 8, 130, 44, 12, 45, 12, 56];
let numToFind = 12
let indexesOf12 = [] // the number whose occurrence in the array we want to find

array1.forEach(function(elem, index, array) {
    if (elem === numToFind) {indexesOf12.Push(index)}
    return indexesOf12
})

console.log(indexesOf12) // outputs [1, 5, 7]
1
Jona Dev

Juste pour partager une autre méthode, vous pouvez utiliser Générateurs de fonctions pour obtenir également le résultat suivant:

function findAllIndexOf(target, needle) {
  return [].concat(...(function*(){
    for (var i = 0; i < target.length; i++) if (target[i] === needle) yield [i];
  })());
}

var target = "hellooooo";
var target2 = ['w','o',1,3,'l','o'];

console.log(findAllIndexOf(target, 'o'));
console.log(findAllIndexOf(target2, 'o'));
0
briosheje

Nous pouvons utiliser Stack et Push "i" dans la pile chaque fois que nous rencontrons la condition "arr [i] == valeur"

Vérifie ça:

static void getindex(int arr[], int value)
{
    Stack<Integer>st= new Stack<Integer>();
    int n= arr.length;
    for(int i=n-1; i>=0 ;i--)
    {
        if(arr[i]==value)
        {
            st.Push(i);
        }
    }   
    while(!st.isEmpty())
    {
        System.out.println(st.peek()+" ");
        st.pop(); 
    }
}
0
S Banzal

Je veux juste mettre à jour avec une autre méthode facile.

Vous pouvez également utiliser la méthode forEach.

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

var result = [];

Cars.forEach((car, index) => car === 'Nano' ? result.Push(index) : null)
0
Ted Khi

Vous pouvez écrire une solution assez simple et lisible à cela en utilisant map et filter:

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