如何在KnockoutJS中使用indexOf

时间:2011-08-03 12:03:50

标签: knockout.js

我在KnockoutJS中使用IndexOf()方法看到的所有示例都是基本的字符串类型。我想知道的是如何根据一个对象变量返回作为对象的数组的索引。

1 个答案:

答案 0 :(得分:66)

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