Skip to content

Instantly share code, notes, and snippets.

@buglss
Last active January 2, 2023 12:35
Show Gist options
  • Save buglss/07b09f6e5eae1df01a9e1b6eccbd0464 to your computer and use it in GitHub Desktop.
Save buglss/07b09f6e5eae1df01a9e1b6eccbd0464 to your computer and use it in GitHub Desktop.
[TR]: Özel bir flat json'dan kompleks bir json üretir. [EN]: Generates a complex json from a specific flat json.
/**
* Flat JSON Yapısı: <json|group,key,value>
* group <string>: Anahtarlanmış birden fazla değeri gruplamak için kullanılan ifadedir.
* Eğer işaretçiye ait bir grup ise işaretçinin group değeri ve key değeri ile isimlendirilmelidir. (group.key)
* key <string>: Anahtar ifadesidir. JSON içinde benzersiz olmalıdır.
* Eğer başka bir grubu işaret edecekse group ve key isimlerinin birleşiminden oluşan grup (group) tanımlanmalıdır. (group.key)
* value <string>: Anahtarlanan ifadenin tuttuğu değerdir. Eğer başka bir grubu (group) işaret edecekse "*" (pointer) değerini alır.
* Örn: [
* ...
* { "group": "anaKategori", "key": "TEST KATEGORİ", "value": "*" },
* { "group": "anaKategori.TEST KATEGORİ", "key": "kapalı", "value": "1" },
* ...
* ]
*/
function flatToComplex(flatData = [], complexData = {}) {
const pointerData = flatData.filter(fd => fd.value === "*")
const pointedData = flatData.filter(fd => pointerData.some(pd => `${pd.group}.${pd.key}` === fd.group))
for(data of flatData) {
/**
* İşaretçi datalar alt obje olarak kullanılıyor. (value: "*")
* Üst katmanda yeniden obje oluşturulmasın.
*
* Üst Obje: {"foo": {<ALT_OBJE>}, ...}
*/
if(pointerData.some(pd => `${pd.group}.${pd.key}` === data.group)) continue
let field = data.group.split(".").at(-1)
complexData[field] = complexData[field] || {}
/**
* İşaretçi data ise (value: "*") kendine ait flat datalarını ve işaretçilerini (value: "*") aynı fonksiyon ile çağır.
* İşaretçi data değil ise objenin elemanı olarak ata.
*/
data.value === "*"
? complexData[field] = flatToComplex([...flatData.filter(fd => `${data.group}.${data.key}` === fd.group), ...pointedData.filter(pd => pd.group.includes(`${data.group}.${data.key}`))], complexData[field])
: complexData[field][data.key] = data.value
}
return complexData
}
/*
let flatData = [
{
"group": "Cinsiyet",
"key": "Erkek",
"value": "150"
},
{
"group": "Cinsiyet",
"key": "Kadın",
"value": "210"
},
{
"group": "Ulaşım Kanalı",
"key": "Wechat",
"value": "*"
},
{
"group": "Ulaşım Kanalı.Wechat",
"key": "Samsun",
"value": "*"
},
{
"group": "Ulaşım Kanalı.Wechat.Samsun",
"key": "Atakum",
"value": "*"
},
{
"group": "Ulaşım Kanalı.Wechat",
"key": "Sinop",
"value": "29"
},
{
"group": "Ulaşım Kanalı.Wechat.Samsun.Atakum",
"key": "Mimarsinan",
"value": "50"
}
]
console.log(flatToComplex(flatData))
=> {
"Cinsiyet": {
"Erkek": "150",
"Kadın": "210"
},
"Ulaşım Kanalı": {
"Wechat": {
"Samsun": {
"Atakum": {
"Mimarsinan": "50"
}
},
"Sinop": "29"
}
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment