Вы можете решить эту проблему с помощью Array.filter
, Array.every
, Array.some
и Array.includes
следующим образом:
var data = { "Cmaj7": ["C", "E", "G", "B"], "C#maj7": ["C#", "F", "G#", "C"], "Dbmaj7": ["C#", "F", "G#", "C"] }
const e = Object.entries(data)
const dubs = e.filter(([k1, v1]) => v1.every(v => e.some(([k2, v2]) => k1 != k2 && v2.includes(v))))
const result = dubs.reduce((acc,[k,v]) => (acc[k] = v, acc), {})
console.log(result)
Идея состоит в том, чтобы затем получить значения каждого ключа и фильтра, чтобы каждое из значений было включено в остальные значения объекта.
Вы также можете просто получить массив ключей с одинаковыми значениями через Array.reduce
и Array.filter
:
var data = { "Cmaj7": ["C", "E", "G", "B"], "C#maj7": ["C#", "F", "G#", "C"], "Dbmaj7": ["C#", "F", "G#", "C"] }
const result = Object.entries(data).reduce((r, [k,v], i, a) => {
let key = v.join('-')
r[key] = [...r[key] || [], k]
return i == a.length-1 ? Object.values(r).filter(a => a.length > 1) : r
}, {})
console.log(...result)