KnockoutJSでIndexOf()メソッドを使用する例はすべて、基本的な文字列型です。私が知りたいのは、オブジェクト変数の1つに基づいて、オブジェクトである配列のインデックスを返す方法です。
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
と呼ばれるユーティリティ関数があり、配列にループして、渡された条件に一致しようとします。ただし、アイテムのインデックスではなくアイテムを返します。配列を2回パスするので、オブジェクトを取得してから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