web-dev-qa-db-ja.com

Lodashを使用してオブジェクト/値からキーを削除する

私はオブジェクトの2つの配列、a&bで終わるようにしています。キー 'name'が配列aに表示される場合、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 }));
});

コードは実行されますが、配列「b」は変更されません。私が期待するのは、配列 "b"がwilmaとbam bamという名前の2つのオブジェクトを持つことです。ループなしでやってみました。

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

コードは実行されますが、小石は行きません。

13
shiped

remove()内でforEach()を使用して、目的の結果を得ることができます...

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

zforEach()...を削除することにより、コードをさらに簡素化できます。

_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