2011-08-03 54 views

回答

61

一個observableArray公開了一個名爲indexOf的方法,該方法是ko.utils.arrayIndexOf的一個包裝,它簡單地遍歷數組尋找傳遞給它的項目。

所以,如果你有項目,你可以這樣做:

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 

如果你只是有像一把鑰匙,然後KO確實有一個叫ko.utils.arrayFirst效用函數,僅僅通過數組循環試圖匹配你傳遞給它的條件。但是,它返回該項目而不是它的索引。獲取對象然後調用indexOf會稍微低效,因爲您會在數組中進行兩次遍歷。

你可以只寫一個循環自己尋找合適的項目或編寫基於ko.utils.arrayFirst一個通用的功能將類似於:

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

現在,你可以傳遞一個數組,條件,您將返回匹配的第一個項目的索引。

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

在你的例子中不應該返回item.id === id;返回item.id()=== id ;?我正在嘗試做一些非常接近的事情,並且必須有()。 – NullReference

+1

只取決於'id'是否可以觀察。在這種情況下,它不是,但聽起來像是你。 –