2011-08-03 16 views
32

Todos los ejemplos que veo de usar el método IndexOf() en KnockoutJS son de tipos de cadenas básicas. Lo que quiero saber es cómo devolver el índice de una matriz que es un objeto, en función de una de las variables del objeto.Cómo usar indexOf en KnockoutJS

Respuesta

61

Un observableArray expone un método llamado indexOf, que es un contenedor a ko.utils.arrayIndexOf que simplemente recorre el conjunto en busca del elemento que le pasa.

Por lo tanto, si usted tiene el elemento que puede hacer:

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 sólo tiene algo así como una clave, a continuación, KO tiene una función de utilidad llamada ko.utils.arrayFirst que acaba de bucle a través de la matriz tratando de igualar la condición de que pases a ella. Sin embargo, devuelve el artículo y no el índice del mismo. Sería ligeramente ineficiente obtener el objeto y luego llamar a indexOf sobre él, ya que haría dos pasadas a través de la matriz.

Se podía escribir un ciclo de uno mismo y el artículo correcto o escribir una función genérica basada en ko.utils.arrayFirst que se vería así:

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

Ahora, puede pasar una matriz, una condición , y se le devolverá el índice del primer artículo que coincida.

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 
+0

En su ejemplo, no debe devolver item.id === id; ser devuelto item.id() === id ;? Estoy intentando hacer algo muy parecido a esto y tuve que tener el(). – NullReference

+1

Solo depende si 'id' es observable o no. En este caso no es así, pero suena como lo es para ti. –