javascript - Hitta alla element/index i en array med predikat - Typescript


Jag skulle vilja hitta indexen för alla förekomster av ett objekt i en lista/en array, helst med hjälp av ett PREDIKAT.

Jag använder IONIC - ANGULAR-ramverket och därför i TYPESCRIPT.

Här är ett konkret exempel på vad jag skulle vilja ha:

        const myList = [0, 2, 1, 1, 3, 4, 1];
        // what already exists:
        myList.findIndex(x => x === 1); // return 2

        // what I would like it to be:
        myList.findAllIndexes(x => x === 1); // should return [2, 3, 6]

Tack på förhand för din hjälp.

Svar #1

Använd map och filtrera de odefinierade objekten från resultatet.

const myList = [0, 2, 1, 1, 3, 4, 1];

const myIndexList = myList.map( (x,index) => { if(x === 1) return index}).filter(item => item !== undefined);

console.log("myIndexList: ", myIndexList);

Svar #2

LÖSNING :

    /**
     * Returns the indexes of all elements in the array where predicate is true, [] otherwise.
     * @param array The source array to search in
     * @param predicate find calls predicate once for each element of the array, in descending
     * order, until it finds one where predicate returns true. If such an element is found,
     * it is added to indexes and the functions continue..
     */
    findAllIndexes<T>(array: Array<T>, predicate: (value: T, index: number, obj: T[]) => boolean): number[] {
        const indexes = [];
        let l = array.length;
        while (l--) {
            if (predicate(array[l], l, array)) {
                indexes.push(l);
            }
        }
        return indexes;
    }

och att använda det :

const myList = [0, 2, 1, 1, 3, 4, 1];
const indexes = this.findAllIndexes(myList, x => x === 1);
// return [6, 3, 2]

ANNAN METOD :

Lite annorlunda men kan vara användbart (tillåter att få alla element och inte index):

const myList = [0, 2, 1, 1, 3, 4, 1];
const allElements = myList.filter(x => x === 1);

PS: Jag valde att iterera loopen från slutet till början, det är möjligt att vända på den för att få [2, 3, 6] istället för [6, 3, 2].

Glad kodning allihopa!