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