Как получить разные ключи, которые имеют одинаковые значения в словаре? - PullRequest
0 голосов
/ 10 декабря 2018

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

var dictionary = {
  "Cmaj7": ["C","E","G","B"] ,     //majors
  "C#maj7": ["C#","F","G#","C"],
  "Dbmaj7":["C#","F","G#","C"]}

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете решить эту проблему с помощью 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)
0 голосов
/ 10 декабря 2018

Как то так?

var dictionary = {
  "Cmaj7": ["C","E","G","B"] ,     //majors
  "C#maj7": ["C#","F","G#","C"],
  "Dbmaj7":["C#","F","G#","C"]}
  
var newObj = {}
for (var o in dictionary) {
  var reverseKey = dictionary[o].join("_");
  if (!newObj[reverseKey]) newObj[reverseKey]=[];
  newObj[reverseKey].push(o);
}
console.log(newObj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...