从数组中过滤具有给定键值的相同对象

sym*_*mpi 1 javascript filter

假设我们有一个如下所示的数组:

[
    {
        id: 0,
        name: 'A'
    },
    {
        id: 1,
        name:'A'
    },
    {
        id: 2,
        name: 'C'
    },
    {
        id: 3,
        name: 'B'
    },
    {
        id: 4,
        name: 'B'
    }
]
Run Code Online (Sandbox Code Playgroud)

我想只保留"name"键上具有相同值的对象.所以输出看起来像这样:

[
    {
        id: 0,
        name: 'A'
    },
    {
        id: 1,
        name:'A'
    },
    {
        id: 3,
        name: 'B'
    },
    {
        id: 4,
        name: 'B'
    }
]
Run Code Online (Sandbox Code Playgroud)

我想使用lodash,但我没有看到任何方法.

Raj*_*esh 8

你可以尝试这样的事情:

理念:

  • 循环数据并创建一个包含其计数的名称列表.
  • 再次循环数据并过滤掉计数<2的任何对象

var data = [{ id: 0, name: 'A' }, { id: 1, name: 'A' }, { id: 2, name: 'C' }, { id: 3, name: 'B' }, { id: 4, name: 'B' }];

var countList = data.reduce(function(p, c){
  p[c.name] = (p[c.name] || 0) + 1;
  return p;
}, {});

var result = data.filter(function(obj){
  return countList[obj.name] > 1;
});

console.log(result)
Run Code Online (Sandbox Code Playgroud)


jon*_*ahe 5

A lodash approach that may (or may not) be easier to follow the steps of:

const originalArray = [{ id: 0, name: 'A' }, { id: 1, name: 'A' }, { id: 2, name: 'C' }, { id: 3, name: 'B' }, { id: 4, name: 'B' }];

const newArray =
      _(originalArray)
      	.groupBy('name') // when names are the same => same group.  this gets us an array of groups (arrays)
        .filter(group => group.length == 2) // keep only the groups with two items in them
        .flatten() // flatten array of arrays down to just one array
        .value();
        
console.log(newArray)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)