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?
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;
}
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.
Une autre approche utilisant Array.prototype.map () et Array.prototype.filter () :
var indices = array.map((e, i) => e === value ? i : '').filter(String)
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.
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); // []
const indexes = cars
.map((car, i) => car === "Nano" ? i : null)
.filter(i => i !== null)
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]
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'));
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();
}
}
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)
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);