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.
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();