对象的过滤器和唯一数组

Filter and uniq array of objects

我有一组对象。每个对象都有两个字段 "type" 和 "position"。我想知道是否有任何对象(在此数组中)具有相同的 "type" 和 "position"(并获取它)。我怎样才能意识到呢?我知道如何过滤数组,但如何与其他对象进行比较?

var array = forms.filter(function (obj) { return obj.type === 100 });

您可以取一个 Map,将相同的 type/postion 个对象分组,然后过滤分组的结果以获得长度大于 1 的结果。

var data = [{ type: 'a', position: 1 }, { type: 'b', position: 1 }, { type: 'a', position: 1 }, { type:'a', position: 2 }, { type: 'b', position: 2 }, { type: 'c', position: 1 }, { type:'c', position: 1 }],
    duplicates = Array
        .from(
            data
                .reduce((m, o) => {
                    var key = ['type', 'position'].map(k => o[k]).join('|');
                    return m.set(key, (m.get(key) || []).concat(o));
                }, new Map)
               .values()
        )
       .filter(({ length }) => length > 1);

console.log(duplicates);

这是另一种方法:

const data = [
  { type: 'a', position: 1 },
  { type: 'b', position: 1 },
  { type: 'a', position: 1 },
  { type: 'a', position: 2 },
  { type: 'b', position: 2 },
  { type: 'c', position: 1 },
  { type: 'c', position: 1 }
]

const duplicates = data =>
  data.reduce((prev, el, index) => {
    const key = JSON.stringify({ p: el.position, t: el.type })
    prev[key] = prev[key] || []
    prev[key].push(el)
    if (index === data.length - 1) {
      return Object.values(prev).filter(dups => dups.length > 1)
    }
    return prev
  }, {})

console.log(duplicates(data))