JS получение объединения всех ключей объектов из массива объектов

#javascript #arrays #object #ecmascript-6

Вопрос:

У меня есть ниже массив объектов:

 var all = [
{f1: "v1", f2: "v2"},
{f1: "v1", f2: "v2", f3: "v3"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
];
 

Желаемый Результат:

 [f1, f2, f3, f4, f5, ...., fn];
 

В Настоящее Время Используется:

 all.reduce((sum, item) => ([...new Set([...sum, ...Object.keys(item)])]), []);
 

Рабочий пример: codepen

Любые предложения по использованию es6 или любой новой функции js для повышения производительности.

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

1. Не на 100% ясно, чего вы пытаетесь достичь, в вашем примере 5 результатов из массива из 4 объектов. Вы пытаетесь получить окончательный ключ объекта. Гарантирован ли заказ?

2. Еще один вариант: new Set(all.map(o => Object.keys(o)).flat())

3. @DamianGreen, желаемый вывод — «массив ключей самого высокого ключа:объект пары значений из данного массива».

4. @FelixKling будет ли это иметь лучшую производительность, так как у нас снова 4 операции.

5. «желаемый результат — «массив ключей самого высокого ключа:объект пары значений из данного массива» , Это не то же самое, что получить объединение всех ключей. Что это сейчас? «будет ли это иметь лучшую производительность, так как у нас снова 4 операции» , Это не создает промежуточных объектов, подобных вашему решению. Но в конце концов вам придется на самом деле измерить производительность различных решений.

Ответ №1:

Вы можете сплющить их в единый объект, а затем взять ключи.

 var all = [
{f1: "v1", f2: "v2"},
{f1: "v1", f2: "v2", f3: "v3"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
];

const output = Object.keys(Object.assign({}, ...all));
console.log(output); 

Ответ №2:

 var all = [
{f1: "v1", f2: "v2"},
{f1: "v1", f2: "v2", f3: "v3"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
];

console.log(Object.keys(all[all.length-1]))
 

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

1. Это предполагает, что последний элемент в массиве содержит все ключи, а все остальные элементы в массиве можно игнорировать. Не совсем ясно, что это безопасное предположение.

2. Нет, любой объект массива может иметь наибольшее количество пар ключ:значение, а не всегда последнее.

3. Я знаю, но для данного ввода он показывает правильные результаты, зачем беспокоиться о заглавных буквах, если их не спрашивают?

Ответ №3:

Используя Array.flatMap и объект набора, чтобы получить набор уникальных ключей, а затем использовать оператор распространения для преобразования набора обратно в массив.

 var all = [
{f1: "v1", f2: "v2"},
{f1: "v1", f2: "v2", f3: "v3"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
];

const res = [...new Set(all.flatMap(Object.keys))];
console.log(res);