Tengo un conjunto de datos JSON bastante complejo que logré filtrar por serial_number. Sin embargo, el obstáculo ahora es que, aunque me está dando el resultado esperado, no está en la forma que esperaba, ya que tenía la impresión de que el resultado devuelto solo tendría una matriz con la coincidencia. Sin embargo, si la salida devuelta es correcta, cualquier explicación es bienvenida. A continuación se muestra el JSON y el código:

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

El código

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)

La salida actualmente no devuelve nada: ingrese la descripción de la imagen aquí

Según la consulta que estoy tomando, es decir, serial_number = 0018, el resultado que espero es

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

También me gustaría saber si el uso del método del mapa me permitiría recorrer las propiedades anteriores para poder mostrarlas en elementos.

0
coolhack7 27 nov. 2021 a las 11:42
Sus datos no coinciden con las propiedades del mapeo / filtrado. ¿tienes algunos datos que coincidan con el código? y ¿te importaría agregar esto a stacksnippets?
 – 
Nina Scholz
27 nov. 2021 a las 11:48
Tenga en cuenta que una matriz, ya sea vacía o no, se evalúa como true en JavaScript, por lo que su if...else siempre devolverá la primera opción.
 – 
Stuart
27 nov. 2021 a las 11:57
Disculpas. Ahora he editado el código y también la captura de pantalla de la salida. Aunque ahora, ambos resultados no tienen nada en ellos.
 – 
coolhack7
27 nov. 2021 a las 12:30
Agregue un resultado deseado junto con los valores de búsqueda tomados.
 – 
Nina Scholz
27 nov. 2021 a las 12:36
Debe agregar .length en if ya que el filtro devolverá [] que se evalúa como verdadero
 – 
Kanishk Anand
27 nov. 2021 a las 12:38

2 respuestas

La mejor respuesta

Necesita extraer y aplanar la matriz grievance y general usando array#flatMap y luego filtrar en serial_number usando 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 nov. 2021 a las 12:40

Puede filtrar las partes anidadas y devolver las partes, si la matriz devuelta tiene una longitud mayor que cero.

Puede adoptar un enfoque recursivo y verificar cada matriz en busca de un objeto con el valor deseado.

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 nov. 2021 a las 12:52