79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
// utils/optionsFormatter.js
|
||
|
||
/**
|
||
* Преобразует массив [key: value] в массив объектов {value: key, label: value}
|
||
*/
|
||
export const formatOptions = (optionsArray) => {
|
||
if (!optionsArray || !Array.isArray(optionsArray)) return []
|
||
|
||
return optionsArray.map((item, index) => {
|
||
// Если это объект с ключами key и value
|
||
if (item && typeof item === 'object' && item.key !== undefined && item.value !== undefined) {
|
||
return {
|
||
value: item.value,
|
||
label: item.key
|
||
}
|
||
}
|
||
|
||
// Если это массив [key, value]
|
||
if (Array.isArray(item) && item.length >= 2) {
|
||
return {
|
||
value: item[0],
|
||
label: item[1]
|
||
}
|
||
}
|
||
|
||
// Если это простой массив значений
|
||
if (typeof item === 'string' || typeof item === 'number') {
|
||
return {
|
||
value: item,
|
||
label: String(item)
|
||
}
|
||
}
|
||
|
||
// Если это объект с произвольными ключами
|
||
if (item && typeof item === 'object') {
|
||
const keys = Object.keys(item)
|
||
if (keys.length > 0) {
|
||
return {
|
||
value: keys[0],
|
||
label: item[keys[0]]
|
||
}
|
||
}
|
||
}
|
||
|
||
// Fallback для непредвиденных форматов
|
||
return {
|
||
value: index,
|
||
label: String(item)
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* Преобразует объект {key: value, key: value} в массив {value: key, label: value}
|
||
*/
|
||
export const formatObjectOptions = (optionsObject) => {
|
||
if (!optionsObject || typeof optionsObject !== 'object') return []
|
||
|
||
return Object.entries(optionsObject).map(([key, value]) => ({
|
||
value: key,
|
||
label: value
|
||
}))
|
||
}
|
||
|
||
/**
|
||
* Универсальная функция, которая определяет тип данных и форматирует соответствующим образом
|
||
*/
|
||
export const normalizeOptions = (input) => {
|
||
if (Array.isArray(input)) {
|
||
return formatOptions(input)
|
||
}
|
||
|
||
if (typeof input === 'object' && input !== null) {
|
||
return formatObjectOptions(input)
|
||
}
|
||
|
||
return []
|
||
}
|