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.
Réponse
Trop de publicités?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