Saya memiliki kumpulan data JSON yang cukup rumit yang berhasil saya filter berdasarkan serial_number. Namun, rintangannya sekarang adalah bahwa meskipun memberi saya output yang diharapkan, itu tidak dalam bentuk yang saya harapkan karena saya mendapat kesan bahwa output yang dikembalikan hanya akan memiliki satu array dengan kecocokan. Namun, jika output yang dikembalikan benar, maka penjelasan apa pun diterima. Di bawah ini adalah JSON dan kodenya:

JSON

[
    {
        "district": "Kolkata",
        "ward_no": [
            {
                "ward": "6",
                "grievance": [
                    {
                        "serial_number": "0001",
                        "name" : "Mr.A"
                    },
                    {
                        "serial_number": "0002",
                        "name" : "Mr.B"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0003",
                        "name" : "Mr.C"
                    },
                    {
                        "serial_number": "0004",
                        "name" : "Mr.D"
                    }
                ]
            },
            {
                "ward": "7",
                "grievance": [
                    {
                        "serial_number": "0005",
                        "name" : "Mr.E"
                    },
                    {
                        "serial_number": "0006",
                        "name" : "Mr.F"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0007",
                        "name" : "Mr.G"
                    },
                    {
                        "serial_number": "0008",
                        "name" : "Mr.H"
                    }
                ]
            }
        ]
    },
    {
        "district": "Hooghly",
        "ward_no": [
            {
                "ward": "8",
                "grievance": [
                    {
                        "serial_number": "0009",
                        "name" : "Mr.I"
                    },
                    {
                        "serial_number": "0010",
                        "name" : "Mr.J"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0011",
                        "name" : "Mr.K"
                    },
                    {
                        "serial_number": "0012",
                        "name" : "Mr.L"
                    }
                ]
            },
            {
                "ward": "9",
                "grievance": [
                    {
                        "serial_number": "0013",
                        "name" : "Mr.M"
                    },
                    {
                        "serial_number": "0014",
                        "name" : "Mr.N"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0015",
                        "name" : "Mr.O"
                    },
                    {
                        "serial_number": "0018",
                        "name" : "Bruno Fernandes"
                    }
                ]
            }
        ]
    }
]

Kode

const query = {
        serial_number : "0018"
    };

    const filterData = dummyData.map(value => value.ward_no.map(
        value => {
            if(value.grievance.filter(value => value.serial_number === query.serial_number)) {
                return value.grievance.filter(value => value.serial_number === query.serial_number)
            } else {
                return value.general.filter(value => value.serial_number === query.serial_number)
            }
        }
    ));

    console.log(filterData)

Output saat ini tidak mengembalikan apa pun: masukkan deskripsi gambar di sini

Saya juga ingin tahu apakah menggunakan metode peta akan memungkinkan saya mengulangi properti di atas untuk dapat menampilkannya dalam elemen.

0
coolhack7 27 November 2021, 11:42
Data Anda tidak cocok dengan properti pemetaan/pemfilteran. apakah Anda memiliki beberapa data yang cocok dengan kode? dan apakah Anda keberatan menambahkan ini ke stacksnippets?
 – 
Nina Scholz
27 November 2021, 11:48
Perhatikan bahwa array, apakah kosong atau tidak, dievaluasi sebagai true dalam JavaScript sehingga if...else Anda akan selalu mengembalikan opsi pertama
 – 
Stuart
27 November 2021, 11:57
Permintaan maaf. Saya sekarang telah mengedit kode dan juga tangkapan layar dari output. Meskipun sekarang, kedua hasilnya tidak memiliki apa-apa di dalamnya
 – 
coolhack7
27 November 2021, 12:30
Silakan tambahkan hasil yang diinginkan bersama dengan nilai pencarian yang diambil.
 – 
Nina Scholz
27 November 2021, 12:36
Anda perlu menambahkan .length di if karena filter akan mengembalikan [] yang bernilai true
 – 
Kanishk Anand
27 November 2021, 12:38

2 jawaban

Jawaban Terbaik

Anda perlu mengekstrak dan meratakan array grievance dan general menggunakan array#flatMap lalu memfilter serial_number menggunakan array#filter.

const dummyData = [ { "district": "Kolkata", "ward_no": [ { "ward": "6", "grievance": [ { "serial_number": "0001", "name" : "Mr.A" }, { "serial_number": "0002", "name" : "Mr.B" } ], "general": [ { "serial_number": "0003", "name" : "Mr.C" }, { "serial_number": "0004", "name" : "Mr.D" } ] }, { "ward": "7", "grievance": [ { "serial_number": "0005", "name" : "Mr.E" }, { "serial_number": "0006", "name" : "Mr.F" } ], "general": [ { "serial_number": "0007", "name" : "Mr.G" }, { "serial_number": "0008", "name" : "Mr.H" } ] } ] },{ "district": "Hooghly", "ward_no": [ { "ward": "8", "grievance": [ { "serial_number": "0009", "name" : "Mr.I" }, { "serial_number": "0010", "name" : "Mr.J" } ], "general": [ { "serial_number": "0011", "name" : "Mr.K" }, { "serial_number": "0012", "name" : "Mr.L" } ] }, { "ward": "9", "grievance": [ { "serial_number": "0013", "name" : "Mr.M" }, { "serial_number": "0014", "name" : "Mr.N" } ], "general": [ { "serial_number": "0015", "name" : "Mr.O" }, { "serial_number": "0018", "name" : "Bruno Fernandes"} ] } ] } ],
      query = { serial_number : "0018" },
      filterData = dummyData
        .flatMap(({ward_no}) => ward_no
              .flatMap(o => ['grievance', 'general'].flatMap(k => o[k])))
        .filter(o => o.serial_number === query.serial_number);
console.log(filterData)
1
Hassan Imam 27 November 2021, 12:40

Anda bisa memfilter bagian bersarang dan mengembalikan bagian mana pun, jika larik yang dikembalikan memiliki panjang lebih besar dari nol.

Anda dapat mengambil pendekatan rekursif dan memeriksa setiap array untuk objek dengan nilai yang diinginkan.

const
    search = o => {
        let result = [];
        Object.entries(o).some(([k, v]) => {
            if (k in query && query[k] === v) return result.push(o);
            if (Array.isArray(v)) {
                const temp = v.flatMap(search);
                if (temp.length) return result.push(...v.flatMap(search));
            }
        });
        return result;
    },
    data = [{ district: "Kolkata", ward_no: [{ ward: "6", grievance: [{ serial_number: "0001", name: "Mr.A" }, { serial_number: "0002", name: "Mr.B" }], general: [{ serial_number: "0003", name: "Mr.C" }, { serial_number: "0004", name: "Mr.D" }] }, { ward: "7", grievance: [{ serial_number: "0005", name: "Mr.E" }, { serial_number: "0006", name: "Mr.F" }], general: [{ serial_number: "0007", name: "Mr.G" }, { serial_number: "0008", name: "Mr.H" }] }] }, { district: "Hooghly", ward_no: [{ ward: "8", grievance: [{ serial_number: "0009", name: "Mr.I" }, { serial_number: "0010", name: "Mr.J" }], general: [{ serial_number: "0011", name: "Mr.K" }, { serial_number: "0012", name: "Mr.L" }] }, { ward: "9", grievance: [{ serial_number: "0013", name: "Mr.M" }, { serial_number: "0014", name: "Mr.N" }], general: [{ serial_number: "0015", name: "Mr.O" }, { serial_number: "0018", name: "Bruno Fernandes" }] }] }],
    query = { serial_number : "0018" },
    result = data.flatMap(search);

console.log(result);
1
Nina Scholz 27 November 2021, 12:52