Как отсортировать по массиву в правильно порядку ключи в объекте
Есть массив 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
→ Ссылка
К сожалению, с объектом это невозможно. Порядок ключей на сегодняшний день будет всегда таким:
- Ключи-строки, содержащие числа, в порядке возрастания.
- Остальные ключи-строки в порядке создания.
- Ключи-символы в порядке создания.
Так что если вы даже пересоздадите объект с нужным порядком ключей, если ключи числовые, они всё равно пересортируются:
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, или сменить формат ключей.