Найти дубликаты в «Массиве объектов» с разными ключами в javascript

#javascript #arrays #object #duplicates #key-value

#javascript #массивы #объект #дубликаты #ключ-значение

Вопрос:

Задан массив объектов. Например

 let letters= [{"a":1,"b":2,"c":7}, {"d":4,"c":21,"f":2}, {"g":34,"c":2} ]
  

Я хотел бы найти ключи, которые во всех трех объектах являются общими. В данном случае c. На выходе я хотел бы видеть «c». Значение теперь не имеет значения, только ключ. Я знаю, как это сделать с одинаковыми ключами (например, id), но понятия не имею, с разными. Спасибо за помощь

Ответ №1:

 let letters= [{"a":1,"b":2,"c":7}, {"d":4,"c":21,"f":2}, {"g":34,"c":2}]

let result = letters
.map(group => Object.keys(group))
.reduce((arr, v) => arr ? arr.filter(key => v.includes(key)) : v, null)

console.log(result)  

это даст вам все общие ключи в массиве.

Комментарии:

1. Следите за этой временной сложностью

2. Временная сложность равна O (n ^ 3)

Ответ №2:

  1. Повторите массив объектов и создайте карту подсчета ключей
  2. Фильтр, отображающий количество элементов, равное количеству элементов в массиве
  3. Возвращает ключи

 const letters = [{"a":1,"b":2,"c":7}, {"d":4,"c":21,"f":2}, {"g":34,"c":2}]

const counts = letters.reduce((map, o) => {
  Object.keys(o).forEach(key => {
    map.set(key, (map.get(key) ?? 0)   1)
  })
  return map
}, new Map())

const duplicates = [...counts].filter(([ _, count ]) => count === letters.length)
  .map(([ key ]) => key)
  
console.info(duplicates)  

Ответ №3:

 const letters = [{"a":1,"b":2,"c":7}, {"d":4,"c":21,"f":2}, {"g":34,"c":2}];

const arrayCommonElements = (arr1, arr2) => {
    const counts = {};
    [...arr1, ...arr2].forEach(e => counts[e] = counts[e] ? counts[e]   1 : 1);
    return Object.keys(counts).filter(e => counts[e] > 1);
}

let result = letters
.map(group => Object.keys(group))
.reduce((arr, v) => arr ? arrayCommonElements(arr,v) : v, null)

console.log(result)  

Комментарии:

1. Уменьшена временная сложность до O (n ^ 2)

Ответ №4:

Используйте forEach цикл и с одной итерацией ключей и поддерживайте track объект для подсчета количества вхождений. После итерации, если определенные ключи повторяются до количества элементов, это означает, что ключ существует во всех.

 const commonKeys = (arr) => {
  const track = {};

  arr.forEach((obj) =>
    Object.keys(obj).forEach(
      (letter) => (track[letter] = (track[letter] ?? 0)   1)
    )
  );
  return Object.keys(track).filter((letter) => track[letter] >= arr.length);
};

let letters = [
  { a: 1, b: 2, c: 7 },
  { d: 4, c: 21, f: 2 },
  { g: 34, c: 2 },
];

console.log(commonKeys(letters));