【发布时间】:2017-07-04 16:37:54
【问题描述】:
我看到的所有在 KnockoutJS 中使用 IndexOf() 方法的例子都是基本的字符串类型。我想知道的是如何根据其中一个对象变量返回作为对象的数组的索引。
【问题讨论】:
标签: knockout.js
我看到的所有在 KnockoutJS 中使用 IndexOf() 方法的例子都是基本的字符串类型。我想知道的是如何根据其中一个对象变量返回作为对象的数组的索引。
【问题讨论】:
标签: knockout.js
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
【讨论】:
id 是否可观察。在这种情况下它不是,但听起来对你来说是。