#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:
- Повторите массив объектов и создайте карту подсчета ключей
- Фильтр, отображающий количество элементов, равное количеству элементов в массиве
- Возвращает ключи
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));