tengo una funcion
const output = {} sites.forEach(obj=>{ const ids = obj.ids if(ids && ids.length>0){ ids.forEach(id=>{ if(!output[id]){ output[id] = [] } output[id].push(obj.url); }); } }); fs.writeFileSync('cleanedData.json', JSON.stringify(output));que toma datos como:
{ url: "www.site.com", ids: ["F20", "C10", "C05"] }, { url: "www.site.com/something", ids: ["F20", "C05", "C10"] }, { url: "www.site.com/somethingelse", ids: ["F20", "C12", "C05"] }y lo transforma para que tenga una lista de todas las identificaciones y todas las direcciones URL con esa identificación:
{ "F20": [ "www.site.com", "www.site.com/something", "www.site.com/somethingelse" ] }, { "C10": [ "www.site.com", "www.site.com/something" ] }, { "C12": [ "www.site.com/somethingelse" ] }, { "C05": [ "www.site.com", "www.site.com/something", "www.site.com/somethingelse" ] }Puedo obtener un recuento de la longitud de la matriz de cada ID con
console.log(Object.values(output).map(id => id.length))Pero no puedo entender cómo incluir eso como parte de forEach, por lo que tengo una clave/valor en cada objeto que muestra la longitud de la matriz.
Use objetos anidados en la salida y asígnele una propiedad de length que incremente cuando presione la matriz.
const sites = [{ url: "www.site.com", ids: ["F20", "C10", "C05"] }, { url: "www.site.com/something", ids: ["F20", "C05", "C10"] }, { url: "www.site.com/somethingelse", ids: ["F20", "C12", "C05"] } ]; const output = {}; sites.forEach(obj => { const ids = obj.ids if (ids && ids.length > 0) { ids.forEach(id => { if (!output[id]) { output[id] = {length: 0, urls: []} } output[id].urls.push(obj.url); output[id].length++; }); } }); console.log(output);Puede usar Array.prototype.reduce() combinado con Array.prototype.forEach() :
const sites = [{url: "www.site.com",ids: ["F20", "C10", "C05"]},{url: "www.site.com/something",ids: ["F20", "C05", "C10"]},{url: "www.site.com/somethingelse",ids: ["F20", "C12", "C05"]}] const output = sites.reduce((a, { url, ids }) => { ids.forEach(id => { a[id] = a[id] || { length: 0, urls: [] } a[id].length += 1 a[id].urls.push(url) }) return a }, {}) console.log(output)