Как отсортировать по массиву в правильно порядку ключи в объекте

Есть массив order в котором указанный правильный порядок полей и есть объект map в котором названия полей. Как можно сделать правильно порядок полей в Map чтобы был как в order?

const order = ['hasTitle', 'hasSubmitButton', 'hasTooltip'];
const map = {
1: 'template',
7: 'hasTooltip',
5: 'hasTitle',
6: 'hasSubmitButton'
}

В результате должно получиться:

map = {
  5: 'hasTitle',
  6: 'hasSubmitButton',
  7: 'hasTooltip',
}

Ответы (3 шт):

Автор решения: Евгений Платов

const order = ['hasTitle', 'hasSubmitButton', 'hasTooltip'];
const map = {
  1: 'template',
  7: 'hasTooltip',
  5: 'hasTitle',
  6: 'hasSubmitButton'
}

const invertMap = {};

for (let key in map) invertMap[map[key]] = key;

const newMap = order.reduce((acc, item) => {
  if (invertMap[item]) acc[invertMap[item]] = item;
  return acc;
}, {})

console.log(newMap);

→ Ссылка
Автор решения: ordman

const order = ['hasSubmitButton', 'hasTooltip', 'hasTitle'];

const map = {
1: 'template',
7: 'hasTooltip',
5: 'hasTitle',
6: 'hasSubmitButton'
};

const entries  = order.map(
i => Object.entries(map).find(e => e[1] === i)
);

// массив с сохранением порядка
console.log(entries);

// объект в котором порядок не гарантирован
console.log(Object.fromEntries(entries));

→ Ссылка
Автор решения: vsemozhebuty

К сожалению, с объектом это невозможно. Порядок ключей на сегодняшний день будет всегда таким:

  1. Ключи-строки, содержащие числа, в порядке возрастания.
  2. Остальные ключи-строки в порядке создания.
  3. Ключи-символы в порядке создания.

Так что если вы даже пересоздадите объект с нужным порядком ключей, если ключи числовые, они всё равно пересортируются:

const obj = {
  '11': 11,
  '3': 3,
  '2': 2,
  '1': 1,
};

console.log(obj); // { '1': 1, '2': 2, '3': 3, '11': 11 }
console.log(Object.keys(obj)); // [ '1', '2', '3', '11' ]

См. подробнее: https://2ality.com/2015/10/property-traversal-order-es6.html

Так что нужно или использовать Map, или сменить формат ключей.

→ Ссылка