Если вы думаете, что у вас будут различные типы данных, а объекты в sources
ране не будут иметь разного порядка своих реквизитов, тогда вы можете использовать Set
с Array.reduce
и JSON.stringify
для преобразования их в строки для сравнения:
const data = [ { "sources": [ { "sourceName": "test_demographics", "table": "test_demographics_summary" } ], "userId": "test", "queryType": { "mixedQuery": false, "queryTable": "test_a_query" } }, { "sources": [ { "sourceName": "something_demographics", "table": "something_demographics_summary" }, { "sourceName": "something_demographics", "table": "something_demographics_summary" } ], "userId": "test", "queryType": { "mixedQuery": false, "queryTable": "test_bquery" } } ]
const exists = (s, v) => {
const json = JSON.stringify(Object.entries(v))
return s.has(json) ? true : (s.add(json), false)
}
const getUniques = arr => {
let merged = data.reduce((r,c) => [...r.sources, ...c.sources]), s = new Set()
return merged.reduce((r,c) => !exists(s, c) ? (r.push(c), r) : r, [])
}
console.log(getUniques(data))
Идея состоит в том, чтобы сначала объединить все sources
через ES6 spread
, а затем с помощью Set
уменьшить их, проверив, является ли строковое представление sources
уже существует в наборе.Мы добавляем только те, которые ** не ** выходят из набора.
Обратите внимание, что каждый раз, когда вы имеете дело с JSON.stringify
и сравнением объекта, вы находитесь в зависимости от порядка свойств в объекте.Вы сравниваете это так, если объект A равен {a: 1, b: 2}
, а объект B равен {b: 2, a: 1}
, они будут считаться различными, поскольку их строковое представление не будет совпадать вообще.Так что, пока это не ваш сценарий, вы должны с этим справиться.
Если, однако, значения в ваших sources
объектах будут только строками , вы также можете рассмотреть возможность использования Array.reduce
и сгруппировать по значениям и просто выбрать первый элемент массива, так как вы знаете, что другие дубли:
const data = [ { "sources": [ { "sourceName": "test_demographics", "table": "test_demographics_summary" } ], "userId": "test", "queryType": { "mixedQuery": false, "queryTable": "test_a_query" } }, { "sources": [ { "sourceName": "something_demographics", "table": "something_demographics_summary" }, { "sourceName": "something_demographics", "table": "something_demographics_summary" } ], "userId": "test", "queryType": { "mixedQuery": false, "queryTable": "test_bquery" } } ]
const getUniques = arr => {
const merged = data.reduce((r,c) => [...r.sources, ...c.sources])
return Object.values(merged.reduce((r,c) => {
r[Object.values(c).join()] = c
return r
}, {}))
}
console.log(getUniques(data))