#javascript #typescript
Вопрос:
Я пытаюсь сгладить следующий объект «необработанный» в объект «плоский»
raw = [ {
"id":"123",
"Date":"12/12/2020",
"Type":{
"id":"456",
"desc":"test1"
} }, {
"id":"124",
"Date":"12/12/2020",
"Type":{
"id":"456",
"desc":"test2"
} } ]
flat =[ {
"id":"123",
"Date":"12/12/2020",
"desc":"test1"
},
{
"id":"124",
"Date":"12/12/2020",
"desc":"test2"
}]
Я попытался сделать следующее:
let flatData:any = []
const flattenObject = (obj:any) => {
const flattened:any = {}
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === 'object' amp;amp; obj[key] !== null) {
Object.assign(flattened, flattenObject(obj[key]))
} else {
flattened[key] = obj[key]
}
})
flatData.push(flattened)
console.log(flattened)
return flattened
}
Результат, который я получаю из приведенного выше фрагмента кода.
……………………………………………………………………………….
Ответ №1:
Вы можете использовать деструкцию объектов в TypeScript.
const raw = [{
"id": "123",
"Date": "12/12/2020",
"Type": { "id": "456", "desc": "test1" }
}, {
"id": "124",
"Date": "12/12/2020",
"Type": { "id": "456", "desc": "test2" }
}];
const mapped = raw.map(({ id, Date, Type: { desc } }) => ({ id, Date, desc }));
console.log(mapped);
.as-console-wrapper { top: 0; max-height: 100% !important; }
Ответ №2:
Функция, которую вы используете для выравнивания объекта, верна, однако вложенное id
свойство в Type
свойстве имеет то же имя свойства id
, что и свойство верхнего уровня. Когда вы выравниваете объект, это значение верхнего уровня id
перезаписывается вложенным id
значением.
Решения:
- Если у вас есть контроль над данными, вы можете переименовать вложенное
id
свойство во что-то другое. - В
flattenObject
функции вы можете префиксировать вложенное свойство именем родительского свойства. т. е.
const flattenObject = (obj:any, prefix = '') => {
const flattened:any = {}
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === 'object' amp;amp; obj[key] !== null) {
Object.assign(flattened, flattenObject(obj[key], prefix))
} else {
flattened[prefix key] = obj[key]
}
})
flatData.push(flattened)
return flattened
Ответ №3:
Вот решение, которое работает, если у вас есть только один уровень глубины и если вы хотите сгладить объекты, независимо от того, каково имя свойства:
const raw = [
{
id: "123",
Date: "12/12/2020",
Type: {
id: "456",
desc: "test1",
},
},
{
id: "124",
Date: "12/12/2020",
Type: {
id: "456",
desc: "test2",
},
},
];
const flatten = (obj) =>
Object.assign(
{},
Object.fromEntries(
Object.values(obj)
.filter((x) => typeof x === "object")
.map((x) => Object.entries(x))
.flat(1)
),
Object.fromEntries(
Object.entries(obj).filter(([, x]) => typeof x !== "object")
)
);
const compute = (data) => data.map(flatten);
console.log(compute(raw));
Комментарии:
1. Значение верхнего уровня
id
перезаписывается вложеннымid
значением.