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

时间:2017-09-01 10:45:19

标签: javascript filter

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

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

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

[
    {
        id: 0,
        name: 'A'
    },
    {
        id: 1,
        name:'A'
    },
    {
        id: 3,
        name: 'B'
    },
    {
        id: 4,
        name: 'B'
    }
]

我想使用lodash,但我没有看到任何针对此案例的方法。

4 个答案:

答案 0 :(得分:7)

您可以尝试这样的事情:

思想:

  • 循环数据并创建一个包含其计数的名称列表。
  • 再次循环数据并过滤掉任何具有计数< 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)

答案 1 :(得分:4)

lodash 方法可能(或可能不)更容易遵循以下步骤:

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)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

答案 2 :(得分:1)

你可以使用哈希表和单个循环来映射对象或只是一个空数组,然后用空数组连接结果。

var data = [{ id: 0, name: 'A' }, { id: 1, name: 'A' }, { id: 2, name: 'C' }, { id: 3, name: 'B' }, { id: 4, name: 'B' }],
    hash = Object.create(null),
    result = Array.prototype.concat.apply([], data.map(function (o, i) {
        if (hash[o.name]) {
            hash[o.name].update && hash[o.name].temp.push(hash[o.name].object);
            hash[o.name].update = false;
            return o;
        }
        hash[o.name] = { object: o, temp: [], update: true };
        return hash[o.name].temp;
    }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:1)

使用array.filter和array.some的简短解决方案:

var data = [ { ... }, ... ];  // Your array
var newData = data.filter((elt, eltIndex) => data.some((sameNameElt, sameNameEltIndex) => sameNameElt.name === elt.name && sameNameEltIndex !== eltIndex));
console.log("new table: ", newTable);