web-dev-qa-db-fra.com

Comment utiliser indexOf dans KnockoutJS

Tous les exemples que je vois d'utiliser la méthode IndexOf () dans KnockoutJS sont de types de chaîne de base. Ce que je veux savoir, c'est comment renvoyer l'index d'un tableau qui est un objet, basé sur l'une des variables d'objet.

35
user656822

Un observableArray expose une méthode appelée indexOf, qui est un wrapper pour ko.utils.arrayIndexOf qui parcourt simplement le tableau à la recherche de l'élément que vous lui passez.

Donc, si vous avez l'article que vous pouvez faire:

var viewModel = {
   items: ko.observableArray([{id: 1, name: "one"}, {id:2, name: "two"}])
};

var item = viewModel.items()[1];

console.log(viewModel.items.indexOf(item)); //equals 1

Si vous avez juste quelque chose comme une clé, alors KO a une fonction utilitaire appelée ko.utils.arrayFirst qui parcourt simplement le tableau en essayant de faire correspondre la condition que vous lui passez. Cependant, il renvoie l'élément et non son index. Il serait légèrement inefficace d'obtenir l'objet, puis d'appeler indexOf dessus, car vous feriez deux passes à travers le tableau.

Vous pouvez simplement écrire une boucle vous-même à la recherche du bon élément ou écrire une fonction générique basée sur ko.utils.arrayFirst qui ressemblerait à:

function arrayFirstIndexOf(array, predicate, predicateOwner) {
    for (var i = 0, j = array.length; i < j; i++) {
        if (predicate.call(predicateOwner, array[i])) {
            return i;
        }
    }
    return -1;
}

Maintenant, vous pouvez passer un tableau, une condition et vous retournerez l'index du premier élément qui correspond.

var viewModel = {
    items: ko.observableArray([{
        id: 1,
        name: "one"},
    {
        id: 2,
        name: "two"}])
};

var id = 2;

console.log(arrayFirstIndexOf(viewModel.items(), function(item) {
   return item.id === id;    
})); //returns 1
66
RP Niemeyer