У меня есть массив объектов. Каждый объект имеет два поля: "тип" и "позиция". Я хочу знать, есть ли какие-либо объекты (в этом массиве) с такими же "типом" и "положением" (и получить его). Как я могу это понять? Я знаю, как фильтровать массив, но как сравнивать с другими объектами?
var array = forms.filter(function (obj) { return obj.type === 100 });
Вы можете взять 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);
Это еще один способ сделать это:
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))