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

JavaScript กรองอาร์เรย์เชิงสัมพันธ์ (associative array) ด้วยอีกอาร์เรย์หนึ่ง

สมมติว่าเรามีอาร์เรย์ของอ็อบเจ็กต์สองอาร์เรย์แบบนี้:

const data = [
  {"XD_A":"XDL","XD_B_1":"38","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"51","XD_B_2":"PB"},
  {"XD_A":"XDL","XD_B_1":"58","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
  {"XD_A":"XDL","XD_B_1":"76","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"}
];
const filters =[{"XD_A":"XDR"},{"XD_B_1":"38"}];

เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์สองอาร์เรย์ดังกล่าวเป็นอาร์กิวเมนต์แรกและอาร์กิวเมนต์ที่สองตามลำดับ ฟังก์ชันควรเลือกเฉพาะอ็อบเจ็กต์จากอาร์เรย์แรก (data array) ที่มีคู่คีย์-ค่าทั้งหมดที่มีอยู่ในอาร์เรย์ที่สอง (filter array) และฟังก์ชันควรเอาอ็อบเจ็กต์เหล่านั้นทั้งหมดใส่ในอ็อบเจ็กต์ใหม่และคืนค่าอ็อบเจ็กต์นั้น สำหรับอาร์เรย์ข้างต้น อาร์เรย์ที่คืนค่าควรมีอ็อบเจ็กต์สองอ็อบเจ็กต์พอดีแบบนี้:

const output = [
  {"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"}
];

ตัวอย่าง

โค้ดสำหรับทำสิ่งนี้คือ:

const data = [
  {"XD_A":"XDL","XD_B_1":"38","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"51","XD_B_2":"PB"},
  {"XD_A":"XDL","XD_B_1":"58","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
  {"XD_A":"XDL","XD_B_1":"76","XD_B_2":"PB"},
  {"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"}
];
const filters =[{"XD_A":"XDR"},{"XD_B_1":"38"}];
const filter = (data, filters) => {
  return data.filter(e => {
    try{
      filters.forEach(o => {
        Object.keys(o).forEach(key => {
          if(e[key] !== o[key]) throw new 1;
        });
      });
      return true;
    }
    catch(e){
      return false;
    }
  });
}
console.info(filter(data, filters));

ผลลัพธ์

ผลลัพธ์ในคอนโซลจะเป็น -

[
  { XD_A: 'XDR', XD_B_1: '38', XD_B_2: 'PB' },
  { XD_A: 'XDR', XD_B_1: '38', XD_B_2: 'PB' }
]