用另一个数组过滤一个可观察的数组?

时间:2013-07-08 18:25:33

标签: knockout.js

我想传入一个id数组并过滤一个可观察数组,以查找那些具有这些ID的项目最佳解决方案?

现在我逐个遍历数组并为每个id过滤一个可观察数组。

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

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

            });

2 个答案:

答案 0 :(得分: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];
});

我希望它有所帮助。

答案 1 :(得分:2)

以下内容将创建filtered,其中包含来自batches id 位于boxes的元素。使用下划线或类似的东西可以大大简化它。

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