เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ของสตริงและคืนค่าออบเจกต์ที่สอดคล้องกับสตริงเหล่านั้น
ตัวอย่างเช่น:
ถ้าอาร์เรย์คือ:
const arr = [ "country.UK.level.1", "country.UK.level.2", "country.US.level.1", "country.UK.level.3" ];
ผลลัพธ์ควรเป็น:
const output = {
"country": [
{"UK" : {"level" : ["1", "2", "3"]}},
{"US" : {"level" : ["1", "2"]}}
]
}
เงื่อนไข
สตริงที่เก็บในอาร์เรย์ str จะไม่ได้จัดเรียงลำดับ และโค้ดควรทนทานต่อสิ่งนี้
สตริงจะปฏิบัติตามรูปแบบ x.y.x.y... โดยที่ x จะเป็นค่าที่ไม่ซ้ำสำหรับอาร์เร้วนั้น และ y สามารถเปลี่ยนได้ ในตัวอย่าง country และ level จะคงที่เสมอเพราะแทนตำแหน่ง x
สิ่งนี้ต้องใช้แนวทาง Recursive เพราะสตริงในอาร์เรย์ str อาจมีความยาวต่างกัน ยิ่งยาวยิ่งลึก
ตัวอย่าง
const arr = [
"country.UK.level.1",
"country.UK.level.2",
"country.US.level.1",
"country.UK.level.3"
];
const stringToObject = arr => {
const obj = {};
arr.forEach(str => {
let curr = obj;
let splitted = str.split('.');
let last = splitted.pop();
let beforeLast = splitted.pop();
splitted.forEach(sub => {
if (!curr.hasOwnProperty(sub)) {
curr[sub] = {};
}
curr = curr[sub];
});
if (!curr[beforeLast]) {
curr[beforeLast] = [];
}
curr[beforeLast].push(last);
});
return obj;
};
console.log(JSON.stringify(stringToObject(arr), undefined, 4));
ผลลัพธ์
โค้ดนี้จะแสดงผลลัพธ์ดังต่อไปนี้บนคอนโซล:
{
"country": {
"UK": {
"level": [
"1",
"2",
"3"
]
},
"US": {
"level": [
"1"
]
}
}
}