Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การแปลงสตริงแบบ Recursive ให้เป็นออบเจกต์ - JavaScript

เราต้องเขียนฟังก์ชัน 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"
      ]
    }
  }
}