web-dev-qa-db-fra.com

Supprimer la clé de l'objet / valeur à l'aide de Lodash

J'essaie de me retrouver avec 2 tableaux d'objets, a & b. Si la clé "nom" apparaît dans le tableau a, je ne veux pas qu'elle apparaisse dans b.

var characters = [
  { 'name': 'barney', 'blocked': 'a', 'employer': 'slate' },
  { 'name': 'fred', 'blocked': 'a', 'employer': 'slate' },
  { 'name': 'pebbles', 'blocked': 'a', 'employer': 'na' },
  { 'name': 'pebbles', 'blocked': 'b', 'employer': 'hanna' },
  { 'name': 'wilma', 'blocked': 'c', 'employer': 'barbera' },
  { 'name': 'bam bam', 'blocked': 'c', 'employer': 'barbera' }
];
var a = _.filter(characters, { 'blocked': 'a' });
var z = _.pluck(a,'name');
var b = _.difference(characters, a);
_(z).forEach(function (n) {

    //_.pull(b, _.filter(b, { 'name': n }));
    //b = _.without(b, { 'name': n });
    // b = _.without(b, _.filter(b, { 'name': n }));
    _.without(b, _.filter(b, { 'name': n }));
});

Le code s'exécute, mais le tableau "b" n'est jamais modifié. Ce que j'attends, c'est que le tableau "b" ait les deux objets avec les noms wilma et bam bam. J'ai essayé de le faire sans boucle.

var c = _.without(b, _.filter(b, { 'name': 'pebbles' }));
var d = _.without(b, { 'name': 'pebbles' });
var f = _.pull(b, { 'name': 'pebbles' });

bien que le code s'exécute, les cailloux n'iront pas.

13
shiped

Vous pouvez utiliser remove() à l'intérieur de forEach() pour obtenir le résultat souhaité ...

_(z).forEach(function (n) {
    _.remove(b, { 'name': n });
});

Le code peut être encore simplifié en supprimant z et forEach()...

var a = _.filter(characters, { 'blocked': 'a' });
var b = _(characters)
            .difference(a)
            .reject(function (x) { 
                return _.where(a, { 'name': x.name }).length; 
            })
            .value();

JSFiddle

20
Anthony Chu