У меня довольно сложный набор данных JSON, который мне удалось отфильтровать по serial_number. Однако теперь проблема заключается в том, что, хотя он дает мне ожидаемый результат, он не в той форме, которую я ожидал, поскольку у меня создалось впечатление, что возвращенный результат будет иметь только один массив с совпадением. Однако, если возвращенный результат верен, любое объяснение приветствуется. Ниже JSON и код:

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"
                    }
                ]
            }
        ]
    }
]

Код

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)

В настоящее время вывод ничего не возвращает: введите описание изображения здесь

В соответствии с запросом, который я выполняю, например serial_number = 0018, ожидаемый результат

{
   "serial_number": "0018",
   "name" : "Bruno Fernandes"
}

Я также хотел бы знать, позволит ли использование метода map перебирать указанные выше свойства, чтобы иметь возможность отображать их в элементах.

0
coolhack7 27 Ноя 2021 в 11:42
Ваши данные не соответствуют свойствам сопоставления / фильтрации. у вас есть данные, соответствующие коду? и не могли бы вы добавить это в stacksnippets?
 – 
Nina Scholz
27 Ноя 2021 в 11:48
Обратите внимание, что массив, независимо от того, пустой он или нет, оценивается в JavaScript как true, поэтому ваш if...else всегда будет возвращать первый вариант.
 – 
Stuart
27 Ноя 2021 в 11:57
Извинения. Теперь я отредактировал код, а также снимок экрана с выводом. Хотя сейчас в обоих результатах ничего нет
 – 
coolhack7
27 Ноя 2021 в 12:30
Пожалуйста, добавьте желаемый результат вместе с взятыми поисковыми значениями.
 – 
Nina Scholz
27 Ноя 2021 в 12:36
Вам нужно добавить .length в if, поскольку фильтр вернет [], который оценивается как истина
 – 
Kanishk Anand
27 Ноя 2021 в 12:38

2 ответа

Лучший ответ

Вам нужно извлечь и сгладить массивы grievance и general с помощью array#flatMap, а затем отфильтровать по serial_number с помощью 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 Ноя 2021 в 12:40

Вы можете отфильтровать вложенные части и вернуть либо части, если возвращаемый массив имеет длину больше нуля.

Вы можете использовать рекурсивный подход и проверять каждый массив на предмет объекта с желаемым значением.

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 Ноя 2021 в 12:52