JS : Record Collection

ติดข้อนี้มา 2 วันแล้วครับ คิดว่าเขียนครบเงื่อนไขตามโจทย์บอก แต่ run ผ่านเงื่อนไขแค่บางข้อ

if (records[id][prop] != “tracks” && value != “”) {
records[id][prop] = value;
}
if (records[id][prop] == “tracks” && records[id].hasOwnProperty(prop) == false) {
records[id][prop] = [];
records[id][prop].push(value);
}
if (records[id][prop] == “tracks” && value != “”) {
records[id][prop].push(value);
}
if (value == “”) {
delete records[id][prop];
}

ข้อสังเกต : บางครั้ง run เงื่อนไข if ที่เขียนทีละตัวหรือมากกว่าหนึ่งตัวพร้อมกันก็ได้ผลลัพธ์ที่ run ผ่านต่างกัน (บางตัวที่เคยผ่าน ไม่ผ่าน)

ถ้าเขียนเงื่อนไขโดยใช้ if แยกกันจะทำให้เกิดปัญหาได้ เมื่อมีเงื่อนไขมีทับซ้อนกัน จะทำให้เกิดการตรวจสอบเงื่อนไขทุกๆ if หากมีหลายเงื่อนไขนิยมใช้ if else มากกว่า

ข้อนี้มาลองดูว่าต้องการอะไร

  1. ถ้า prop ไม่ใช่ tracks และ value ไม่ใช่ empty string ให้อัปเดต หรือกำหนด prop ของอัลบั้ม ให้มีค่าเป็น value
if (prop != "tracks" && value != "") {
  records[id][prop] = value
}
  1. ถ้า prop เป็น tracks แต่อัลบั้มไม่มี property tracks ให้สร้าง empty array และเพิ่ม value เข้าไป
if (prop == "tracks" && value!= "" && records[id].hasOwnProperty(prop)==false) {
  records[id][prop] = [value]
}
  1. ถ้า prop เป็น tracks และ value ไม่ใช่ empty string ให้เพิ่ม value ไปยังท้ายอัลบั้มที่มี array tracks อยู่
if (prop == "tracks" && value!= "" && records[id].hasOwnProperty(prop)) {
  records[id][prop].push(value)
}
  1. ถ้า value เป็น empty string ให้ลบ property prop ออกจากอัลบั้ม
if (value== "") {
  delete records[id][prop]
}

เอามารวมกัน

if (prop != "tracks" && value != "") {
  records[id][prop] = value
}else if (prop == "tracks" && value!= "" && records[id].hasOwnProperty(prop)==false) {
  records[id][prop] = [value]
}else if (prop == "tracks" && value!= "" && records[id].hasOwnProperty(prop)) {
  records[id][prop].push(value)
}else if (value== "") {
  delete records[id][prop]
}

จะเห็นว่าในกรณี prop เป็น tracks จะมีเงื่อนไขบางส่วนเหมือนกัน อาจจะปรับเปลี่ยนเงื่อนไขให้ดูง่ายขึ้น

  if (prop == "tracks" && value != "") {
    if (records[id].hasOwnProperty(prop)) {
      records[id][prop].push(value);
    } else {
      records[id][prop] = [value];
    }
  } else if (value != "") {
    records[id][prop] = value;
  } else {
    delete records[id][prop];
  }
1 Likes

ขอบคุณสำหรับคำอธิบายอย่างละเอียดครับ ทำให้ผมเข้าใจข้อผิดพลาดของตัวเอง

  1. คิดเยอะไป แค่ check ว่าใช่ tracks หรือเปล่า ? ก็ใช้แค่ prop != “tracks” ไม่ใช่ใช้ records[id][prop] เพราะตัวนี้ไม่ใช่ property แต่เป็นค่าใน property
  2. จากข้อ 1 records[id][prop] == “tracks” เป็นการ checks เงื่อนไขที่ผิด ถ้าต้องการ check ว่ามี property หรือเปล่า ? ต้องใช้ records[id].hasOwnProperty(prop)
  3. ตอนแรกผมใช้ else if แต่ไม่สามารถแก้โจทย์ได้ เลยแยก if ทำให้เกิดเงื่อนไขซ้อนทับเหมือนที่คุณ cchayanin กล่าวไว้