我想传入一个id数组并过滤一个可观察数组,以查找那些具有这些ID的项目最佳解决方案?
现在我逐个遍历数组并为每个id过滤一个可观察数组。
visibleCheckBoxes.each(function (i, v) {
var item = ko.utils.arrayFilter(self.batches(), function (batch) {
return batch.BatchID() == v.id;
});
});
答案 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;
});