2013-07-08 4 views
0

Я хочу передать массив идентификаторов и фильтровать наблюдаемый массив для элементов, которые имеют эти идентификаторы, что является лучшим решением?фильтровать наблюдаемый массив другим массивом?

прямо сейчас, итерации по массиву один за другим и фильтрации наблюдаемого массива для каждого отдельного идентификатора.

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

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

      }); 
+0

Итак, вы хотите принять все элементы в 'batches', которые имеют' id', который присутствует в 'visibleCheckBoxes'? – altschuler

+0

есть, тот правый. и идентификаторы гарантированно находятся в массиве наблюдаемых массивов. – Xerxes

ответ

2

Ниже будет создавать filtered, который содержит элементы из batches которого идентификатора находится в 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; 
}); 
2

Если идентификатор уникален, лучше использовать arrayFirst. О (п^(п/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]; 
}); 

Надеюсь, это поможет.

Смежные вопросы