Boris tiene una lista de todas las cervezas disponibles en su pub, pero es un gran lío. Le gustaría ver las cervezas agrupadas por marcas. Boris también le dijo que la función debería devolver una matriz de objetos que contenga el nombre de la marca y una matriz de ID de cerveza de esa marca.
Archivo JSON con datos: https://challenge.codingsans.com/beers.json
Ejemplo de salida:
[ { "brand": "brandName2", "beers": [ "beerID3", "beerID4" ] }, { "brand": "brandName1", "beers": [ "beerID2", "beerID1" ] } ]//
Hice esto: (Así que básicamente nada. Solo me gustaría tener una idea de cómo resolverlo).
request = new XMLHttpRequest; request.open('GET', 'https://challenge.codingsans.com/beers.json', true); var data = []; request.onload = function() { if (request.status >= 200 && request.status < 400) { // Date Parse data = JSON.parse(request.responseText); // Success! // Arrays var beerIDs = []; var beerBrand = []; // Iteration for (var key in data) { beerIDs.push(data[key].id); beerBrand.push(data[key].brand); // console.log(beerIDs); // console.log(beerBrand); } console.log(beerIDs); console.log(beerBrand); //final list var finalList = []; } else { // We reached our target server, but it returned an error } }; request.onerror = function() { // There was a connection error of some sort }; request.send();Prueba esto:
request = new XMLHttpRequest; request.open('GET', 'https://challenge.codingsans.com/beers.json', true); var data = []; request.onload = function() { if (request.status >= 200 && request.status < 400) { // Date Parse data = JSON.parse(request.responseText); // Success! const organizedBeers = data.reduce((acc, beers) => { const findIndex = acc.findIndex(beer => beer.brand === beers.brand) if(findIndex > -1) { acc[findIndex].beersId.push(beers.id) } else { acc.push({ brand: beers.brand, beersId: [beers.id], }) } return acc; }, []) console.log(organizedBeers) } else { // We reached our target server, but it returned an error } }; request.onerror = function() { // There was a connection error of some sort }; request.send();Básicamente, puede crear una nueva matriz que será el resultado final (en nuestro caso, digamos 'aBeerNBrands'). Y puede insertar un nuevo objeto con las propiedades requeridas (como 'marca': cadena, ids: matriz) allí. Y luego puede recorrer el elemento de la matriz principal (en su caso: 'datos') y en el bucle anidado puede verificar si ese objeto de marca está presente en la nueva matriz ('aBeerNBrands') o no, si está presente, entonces presione la identificación a la matriz de ids presente dentro del objeto de aBeerNBrands; de lo contrario, cree un nuevo objeto dentro de 'aBeerNBrands' con las propiedades requeridas. El siguiente código funciona bien para su requerimiento.
request = new XMLHttpRequest; request.open('GET', 'https://challenge.codingsans.com/beers.json', true); var data = []; request.onload = function() { debugger; if (request.status >= 200 && request.status < 400) { // Date Parse data = JSON.parse(request.responseText); // Success! // Arrays var aBeerNBrands = []; // Iteration for (var key in data) { if(aBeerNBrands.length > 0){ for(var key2 in aBeerNBrands){ if(aBeerNBrands[key2].brand === data[key].brand){ aBeerNBrands[key2].ids.push(data[key].id); break; } if(key2 == aBeerNBrands.length - 1 && aBeerNBrands[key2].brand !== data[key].brand){ var oBrandObject = { brand: data[key].brand, ids: [data[key].id] }; aBeerNBrands.push(oBrandObject); } } } else{ var oBrandObject = { brand: data[key].brand, ids: [data[key].id] }; aBeerNBrands.push(oBrandObject); } // console.log(beerIDs); // console.log(beerBrand); } console.log(aBeerNBrands); } else { // We reached our target server, but it returned an error } }; request.onerror = function() { // There was a connection error of some sort }; request.send();Siga los pasos a continuación:
Demostración de trabajo:
const data = [ { "id": "ccw-1", "name": "Coding Challenge White", "brand": "Coding Challenge Brewery" }, { "id": "sw-1", "name": "Share White", "brand": "Share", }, { "id": "bspa-1", "name": "Beer Sans Pale Ale", "brand": "Beer Sans Brewery" }, { "id": "ccb-1", "name": "Coding Challenge Brown", "brand": "Coding Challenge Brewery" }, { "id": "ccw-2", "name": "Coding Challenge Wheat", "brand": "Coding Challenge Brewery" }]; // result array const resultArr = []; // grouping by brand and resulting with an object using Array.reduce() method const groupByBrand = data.reduce((group, item) => { const { brand } = item; group[brand] = group[brand] ?? []; group[brand].push(item.id); return group; }, {}); // Finally structuring the output based on the brand object we have. Object.keys(groupByBrand).forEach((item) => { resultArr.push({ 'brand': item, 'beers': groupByBrand[item] }) }) // Result console.log(resultArr);