2013-02-27 19 views
20

filtrelemeye çalışıyorum. Ortak özellik kimliği id. Filtreden emin değilim + her biri bunu yapmanın en iyi yolu ya da haritayı azalt. Neyse, aşağıdaki kod çalışmıyor out boş liste.underscore.js, başka bir nesneyi temel alan bir nesneyi filtrelemeye çalıştığım bir nesne nesnesini başka bir

var aaa = [ 
    {name: "AAA", id: 845}, 
    {name: "BBB", id: 839}, 
    {name: "CCC", id: 854} 
]; 
var bbb = [ 
    {id: 839}, 
    {id: 854} 
]; 

var out = _.filter(aaa, function(val){ 
    return _.each(this, function(val2){ 
     return val['id'] === val2['id'] 
    }); 
}, bbb); 

cevap

37

Sadece geçerli kimlikleri "set" oluşturmak ve filtreleme yapmak için "set" olduğunu kullanın: o n * öyle,

var aaa = [ 
    {name: "AAA", id: 845}, 
    {name: "BBB", id: 839}, 
    {name: "CCC", id: 854} 
]; 
var bbb = [ 
    {id: 839}, 
    {id: 854} 
]; 

var ids = {}; 
_.each(bbb, function (bb) { ids[bb.id] = true; }); 

var out = _.filter(aaa, function (val) { 
    return ids[val.id]; 
}, bbb); 

ids hızlı Dolum amortized O (1), yani O (n). Aynı filtreleme için de geçerlidir.

İç döngüde each(…) kullanırsanız, O (n²) olacaktır. Daha büyük veri setleri için bu çok yavaş olur. Ayrıca ek yuvalama kodu ilk bakışta okumak/anlamak daha zor hale getirir. Sen _.some(list, [iterator], [context]) kullanabilirsiniz http://jsfiddle.net/SMtX5/

+1

thans arkasındaki açıklama ve muhakeme için. – bsr

2

:

eylem snipped bu kodu bakınız.

O listede değerlerin herhangi yineleyici gerçeği testini geçerse gerçek döndürür.

var out = _.filter(aaa, function(val){ 
    return _.some(this,function(val2){ 
     return val2['id'] === val['id']; 
    }); 
}, bbb); 

İşte jsfiddle. http://jsfiddle.net/h98ej/

+0

Kabul edilen cevaba dayanarak, bu rutine göre daha hızlı ve daha kabul edilen nedir? –

15

filtrelemek _.find kullanabilirsiniz:

_.filter(aaa, function(a){ 
    return _.find(bbb, function(b){ 
     return b.id === a.id; 
    }); 
}); 
1
bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf(_.id) > -1) 

Sadece yapmak saf JS dizi işlevler gerektiğini sizin kullanım örneğini varsayarak.

İlgili konular