J'essaie de filtrer un tableau d'objets, basé sur un autre. L'ID de propriété commune id
. Je ne suis pas sûr que le filtre + chacun soit la meilleure façon de le faire ou de réduire la carte. Quoi qu'il en soit, le code ci-dessous ne fonctionne pas car out
est une liste vide.
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);
Créez simplement un "ensemble" des identifiants valides et utilisez cet "ensemble" pour effectuer le filtrage:
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);
Remplir ids
est rapide, il est en n * amorti O (1), c'est-à-dire O (n). Il en va de même pour le filtrage.
Si vous utilisez each(…)
dans la boucle interne, vous aurez O (n²). Pour des ensembles de données plus volumineux, cela deviendrait très lent. De plus, l'imbrication supplémentaire rend le code plus difficile à lire/à comprendre à première vue.
Voir ce code coupé en action: http://jsfiddle.net/SMtX5/
vous pouvez utiliser _.find
à filtrer:
_.filter(aaa, function(a){
return _.find(bbb, function(b){
return b.id === a.id;
});
});
bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf( _.id ) > -1)
Vous avez juste besoin de fonctions de tableau JS pures pour cela en supposant votre cas d'utilisation.
Vous pouvez utiliser _.some(list, [iterator], [context])
.
Il renvoie vrai si l'une des valeurs de la liste passe l'itérateur test de vérité.
var out = _.filter(aaa, function(val){
return _.some(this,function(val2){
return val2['id'] === val['id'];
});
}, bbb);
Voici jsfiddle. http://jsfiddle.net/h98ej/