35 votes

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.

66voto

RP Niemeyer Points 81663

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

Donc, si vous avez l'élément 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 quelque chose comme une clé, puis KO dispose d'une fonction d'utilité appelés ko.utils.arrayFirst qui vient de boucles à travers le tableau qui tentent de correspondre à la condition que vous lui transmettez. Toutefois, elle renvoie l'article, et non l'indice d'elle. Ce serait un peu inefficace pour obtenir l'objet et ensuite appeler indexOf sur elle, comme vous le feriez faire deux passes dans le tableau.

Vous pouvez simplement écrire une boucle de vous-même à la recherche de l'élément de droite ou écrire une fonction générique basé sur ko.utils.arrayFirst qui pourrait ressembler à:

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, d'un état, et vous sera retourné à l'index du premier élément correspondant.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X