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

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

1
Nikita Kazeichev 23 Окт 2018 в 15:24

2 ответа

Лучший ответ

Вы можете взять 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);
1
Nina Scholz 23 Окт 2018 в 12:41

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

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))
1
lipp 23 Окт 2018 в 13:39
52949032