web-dev-qa-db-fra.com

underscore.js filtre un tableau d'objets, basé sur un autre

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);
23
bsr

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/

39
kay - SE is evil

vous pouvez utiliser _.find à filtrer:

_.filter(aaa, function(a){
    return _.find(bbb, function(b){
        return b.id === a.id;
    });
});
19
anhulife
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.

2
Tony Broyez

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/

2
pktangyue