0

ID の配列を渡し、これらの ID を持つアイテムの監視可能な配列をフィルター処理したいのですが、最善の解決策は何ですか?

現在、配列を1つずつ反復処理し、個々のIDごとに監視可能な配列をフィルタリングしています。

visibleCheckBoxes.each(function (i, v) {
            var item = ko.utils.arrayFilter(self.batches(), function (batch) {

                return batch.BatchID() == v.id;
            });

            });
4

2 に答える 2

2

ID が一意の場合は、arrayFirstを使用することをお勧めします。 O(n^(n/2))

var batches = self.batches();
visibleCheckBoxes.each(function (i, v) {
    var item = ko.utils.arrayFirst(batches , function (batch) {
        return batch.BatchID() == v.id;
    });
});

そして、アイテムO(2n)がたくさんある場合。

batchesDict = {};
var batchesDict = ko.utils.arrayForEach(self.batches(),function(batch){
     batchesDict[batch.BatchID()] = batch;
});

visibleCheckBoxes.each(function (i, v) {
    var item = batchesDict[v.id];
});

お役に立てば幸いです。

于 2013-07-08T18:44:10.907 に答える
2

以下は、idが inのfiltered要素を含む whichを作成します。アンダースコアなどを使用すると、大幅に簡略化できます。batchesboxes

var boxes = ko.observableArray([{id:1},{id:3}]);
var batches = ko.observableArray([{bId:1, name:"ID1"},{bId:2, name:"ID2"},{bId:3, name:"ID3"},{bId:4, name:"ID4"}]);

var filtered = ko.utils.arrayFilter(batches(), function (batch) {
    for (var i = 0; i < boxes().length; i++) 
        if (batch.bId == boxes()[i].id) 
            return true;

    return false;
});

作業フィドルhttp://jsfiddle.net/JD2Q2

したがって、あなたの例では、次のようになります

var filtered = ko.utils.arrayFilter(self.batches(), function (batch) {
    for (var i = 0; i < visibleCheckBoxes().length; i++)
        if (batch.bId == visibleCheckBoxes()[i].id) 
            return true;

    return false;
});
于 2013-07-08T18:48:46.257 に答える