wake-up-neo.net

Wie finde ich den Index aller Vorkommen eines Elements im Array?

Ich versuche, den Index aller Instanzen eines Elements, beispielsweise "Nano", in einem JavaScript-Array zu finden.

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

Ich habe jQuery.inArray oder auf ähnliche Weise .indexOf () ausprobiert, aber es wurde nur der Index der letzten Instanz des Elements angegeben, d. H. In diesem Fall 5.

Wie bekomme ich es für alle Fälle?

70
norbdum

Die .indexOf()-Methode hat einen optionalen zweiten Parameter, der den Index angibt, von dem aus die Suche beginnen soll. Sie können ihn also in einer Schleife aufrufen, um alle Instanzen eines bestimmten Werts zu finden:

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

Sie machen nicht wirklich klar, wie Sie die Indizes verwenden möchten, also gibt meine Funktion sie als Array zurück (oder gibt ein leeres Array zurück, wenn der Wert nicht gefunden wird), aber Sie könnten mit den einzelnen Indexwerten auch etwas anderes machen in der Schleife.

UPDATE: Gemäß dem Kommentar von VisioN würde eine einfache for-Schleife die gleiche Aufgabe effizienter erledigen, und sie ist einfacher zu verstehen und daher einfacher zu warten:

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

Eine andere alternative Lösung ist die Verwendung von 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 .: Überprüfen Sie die Browser-Kompatibilität für reduce-Methode und verwenden Sie polyfill , falls erforderlich.

51
VisioN

Ein anderer Ansatz unter Verwendung von Array.prototype.map () und Array.prototype.filter () :

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

Hinweis: MDN gibt eine Methode unter Verwendung einer while-Schleife an :

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

Ich würde nicht sagen, dass es besser ist als andere Antworten. Nur interessant.

3
abalter

Einfacherer Weg mit Es6-Stil.

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

Das hat für mich funktioniert:

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

Um eine andere Methode mit anderen zu teilen, können Sie auch Funktionsgeneratoren verwenden, um das Ergebnis zu erzielen:

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

Wir können Stack und Push "i" jedes Mal verwenden, wenn die Bedingung "arr [i] == value" auftritt

Überprüfen Sie dies:

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

Ich möchte nur mit einer anderen einfachen Methode aktualisieren.

Sie können auch die Methode forEach verwenden.

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

var result = [];

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

Sie können mit map und filter eine ziemlich einfache, lesbare Lösung dafür schreiben:

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