Фильтр и уникальный массив объектов

1

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

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

  • 0
    Пожалуйста, обратитесь w3schools.com/jsref/jsref_filter.asp
  • 0
    Возможная копия Удалить дубликаты из массива объектов в JavaScript
Показать ещё 3 комментария
Теги:
filter
uniq

2 ответа

1
Лучший ответ

Вы можете взять 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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню