使用Lodash从对象/值中删除键

shi*_*ped 13 arrays 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 }));
});
Run Code Online (Sandbox Code Playgroud)

代码运行,但数组"b"永远不会改变.我期望数组"b"有两个名为wilma和bam bam的对象.我尝试没有循环.

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

虽然代码执行,鹅卵石也不会去.

Ant*_*Chu 20

你可以remove()在里面forEach()用来达到你想要的效果......

_(z).forEach(function (n) {
    _.remove(b, { 'name': n });
});
Run Code Online (Sandbox Code Playgroud)

通过删除zforEach()... 可以进一步简化代码

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

的jsfiddle

  • 我显然太愚蠢,无法弄清楚如何接受答案。我想接受。它确实解决了我的问题。 (2认同)