2011-08-03 15 views
32

Wszystkie przykłady, widzę korzystania z metody IndexOf() w KnockoutJS są podstawowe typy ciągów. Chcę wiedzieć, jak zwrócić indeks tablicy, która jest obiektem, na podstawie jednej ze zmiennych obiektu.Jak korzystać z indexOf w KnockoutJS

Odpowiedz

61

ObservableArray udostępnia metodę o nazwie indexOf, która jest opakowaniem do ko.utils.arrayIndexOf, która po prostu przeplata tablicę w poszukiwaniu elementu, który mu przekazujesz.

Tak więc, jeśli masz pozycję można zrobić:

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 

Jeśli tylko coś w rodzaju klucza, następnie KO ma funkcję użytkową o nazwie ko.utils.arrayFirst że tylko pętle za pośrednictwem tablicy stara się dopasować warunek, że się do niego zaliczasz. Zwraca jednak element, a nie jego indeks. Byłoby trochę nieefektywne, aby uzyskać obiekt, a następnie wywołać indexOf na nim, tak jak zrobiłbyś dwa przejścia przez tablicę.

Mogłeś po prostu napisać pętlę sam poszukuje odpowiedniej pozycji lub napisać funkcję rodzajowe oparte na ko.utils.arrayFirst że wyglądałby następująco:

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

Teraz można przekazać tablicę, warunek , a otrzymasz indeks pierwszego pasującego elementu.

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

W twoim przykładzie nie powinien zwracać item.id === id; be return item.id() === id ;? Próbuję zrobić coś bardzo blisko tego i musiałem(). – NullReference

+1

Zależy tylko, czy 'id' jest obserwowalny czy nie. W tym przypadku tak nie jest, ale brzmi jak dla ciebie. –