Вы можете сначала сгруппировать их по статусу в один объект, а затем отфильтровать значения на основе желаемого состояния, используя методы filter
и every
.
const data = [{"status":"ABC","groupID":"Group 1"},{"status":"PQR","groupID":"Group 1"},{"status":"ABC","groupID":"Group 1"},{"status":"ABC","groupID":"Group 1"},{"status":"XYZ","groupID":"Group 1"},{"status":"ABC","groupID":"Group 2"},{"status":"ABC","groupID":"Group 2"},{"status":"ABC","groupID":"Group 2"},{"status":"ABC","groupID":"Group 3"},{"status":"PQR","groupID":"Group 3"},{"status":"XYZ","groupID":"Group 4"},{"status":"LMN","groupID":"Group 4"},{"status":"PQR","groupID":"Group 4"},{"status":"ABC","groupID":"Group 5"}]
const filterByStatus = (data, status) => {
const grouped = data.reduce((r, e) => {
if (!r[e.groupID]) r[e.groupID] = [e]
else r[e.groupID].push(e)
return r;
}, {})
return Object.values(grouped)
.filter(a => a.every(e => e.status === status))
.flat()
}
console.log(filterByStatus(data, 'ABC'))
Чтобы получить массив просто groupID, которые все соответствуют статусу, вы можете использовать другой подход с Set
, чтобы получить все уникальные groupID, а затем использовать фильтр, чтобы получить только нужные .
const data = [{"status":"ABC","groupID":"Group 1"},{"status":"PQR","groupID":"Group 1"},{"status":"ABC","groupID":"Group 1"},{"status":"ABC","groupID":"Group 1"},{"status":"XYZ","groupID":"Group 1"},{"status":"ABC","groupID":"Group 2"},{"status":"ABC","groupID":"Group 2"},{"status":"ABC","groupID":"Group 2"},{"status":"ABC","groupID":"Group 3"},{"status":"PQR","groupID":"Group 3"},{"status":"XYZ","groupID":"Group 4"},{"status":"LMN","groupID":"Group 4"},{"status":"PQR","groupID":"Group 4"},{"status":"ABC","groupID":"Group 5"}]
const filterByStatus = (data, status) => {
const groups = new Set(data.map(({groupID}) => groupID))
return [...groups].filter(g => !data.some(e => e.groupID == g && e.status !== status ))
}
console.log(filterByStatus(data, 'ABC'))