Фильтр и уникальный массив объектов - PullRequest
0 голосов
/ 23 октября 2018

У меня есть массив объектов.Каждый объект имеет два поля «тип» и «позиция».Я хочу знать, есть ли какие-либо объекты (в этом массиве) с такими же "типом" и "положением" (и получить его).Как я могу это понять?Я знаю, как фильтровать массив, но как сравнивать с другими объектами?

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Это еще один способ сделать это:

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))
0 голосов
/ 23 октября 2018

Вы можете взять Map, сгруппировать объекты одного типа / позиции и отфильтровать сгруппированный результат для длины больше единицы.

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);
...