0

我想传入一个 id 数组并为具有这些 id 的项目过滤一个可观察数组什么是最好的解决方案?

现在逐个迭代数组并为每个单独的 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 是唯一的,您最好使用arrayFirstO(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

以下将创建filtered包含id为 inbatches的元素。通过使用下划线或类似的东西可以大大简化它。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;
});
于 2013-07-08T18:48:46.257 回答