Last active
January 2, 2023 12:35
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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