Javascript 使用knockout.js计算函数创建两个数组?
我有一个用户可以执行搜索的对象数组。我使用一个基于搜索的ko.computed函数来创建另一个匹配项数组以供显示Javascript 使用knockout.js计算函数创建两个数组?,javascript,knockout.js,computed-observable,Javascript,Knockout.js,Computed Observable,我有一个用户可以执行搜索的对象数组。我使用一个基于搜索的ko.computed函数来创建另一个匹配项数组以供显示 self.matchedRecords = ko.computed(function() { return ko.utils.arrayFilter(self.transponders(), function(r) { return r.title.toLowerCase().indexOf($('.search-input').val().toLowerCase())
self.matchedRecords = ko.computed(function() {
return ko.utils.arrayFilter(self.transponders(), function(r) {
return r.title.toLowerCase().indexOf($('.search-input').val().toLowerCase()) > -1
}
};
这非常有效,到目前为止的表现给我留下了深刻的印象
这个问题是我还需要“不匹配”记录,因为在某些情况下(60%的时间)我必须对它们执行加法操作。我真的不想创建第二个ko.computed函数,因为每次执行搜索时,我都必须再次运行这个数组
那么,我的问题是:有没有一种方法可以使用相同的ko.computed创建第二个不匹配项数组?基本上遍历数组并将每个项目放入匹配或不匹配的数组中
如果没有,是否更快:
1) 创建第二个ko.computed,以便在用户搜索时从我的数组中获取不匹配的项;或
2) 编写arrayDiff函数,并根据需要确定不匹配的项目
干杯 如果您担心性能,您可以在计算机中迭代搜索结果时填充一个不可观察的数组。还要注意,您在循环中反复选择使用jQuery,我认为这否定了KO导致的任何减速
self.missedRecords = [];
self.matchedRecords = ko.computed(function() {
var searchQuery = $('.search-input').val().toLowerCase(),
transponders = self.transponders(),
matched = [];
// Clear out missed records
self.missedRecords.length = 0;
_.each(transponders, function(transponder) {
if (transponder.title.toLowerCase().indexOf(searchQuery) >= 0) {
matched.push(transponder);
} else {
self.missedRecords.push(transponder);
}
});
return matched;
});
我使用了下划线中的。
来缩短代码。这种方法的缺点是对missedRecords
的更改不能(可靠地)绑定到UI(例如,如果您有foreach
绑定)
如果您确实需要可以观察到missedRecords
阵列,并且仍然希望保持快速(er),您可以执行以下操作:
self.missedRecords = ko.observableArray([]);
self.matchedRecords = ko.computed(function() {
var searchQuery = $('.search-input').val().toLowerCase(),
transponders = self.transponders(),
matched = [],
missed = [];
_.each(transponders, function(transponder) {
if (transponder.title.toLowerCase().indexOf(searchQuery) >= 0) {
matched.push(transponder);
} else {
missed.push(transponder);
}
});
// Clear out missed records, without triggering subscriptions
self.missedRecords().length = 0;
// Copy the local missed array to the KO observable array
// This will NOT trigger notifications
ko.utils.arrayPushAll(self.missedRecords(), missed);
// Tell KO that the observable array has mutated - this will trigger changes
// to anything observing the missedRecords array
self.missedRecords.valueHasMutated();
return matched;
});
您也可以完全跳过computed
,只需订阅更改即可更改阵列的状态。例如:
self.missedRecords = ko.observableArray([]);
self.matchedRecords = ko.observableArray([]);
self.transponders.subscribe(function(newTransponders) {
var matched = [],
missed = [];
_.each(newTransponders, function(transponder) {
// Populate matched/missed local arrays
});
// Copy the arrays to the observableArray instances using the technique above
});
只需使用第二个计算机,您就陷入了过早的优化中。我想您已经在订阅中使用了它。。从来没有想过这样做-谢谢!