web-dev-qa-db-ja.com

KnockoutJSでindexOfを使用する方法

KnockoutJSでIndexOf()メソッドを使用する例はすべて、基本的な文字列型です。私が知りたいのは、オブジェクト変数の1つに基づいて、オブジェクトである配列のインデックスを返す方法です。

35
user656822

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
66
RP Niemeyer