Javascript 使用knockout.js计算函数创建两个数组?

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())

我有一个用户可以执行搜索的对象数组。我使用一个基于搜索的ko.computed函数来创建另一个匹配项数组以供显示

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
});

只需使用第二个计算机,您就陷入了过早的优化中。我想您已经在订阅中使用了它。。从来没有想过这样做-谢谢!