Tengo una matriz de Objetos que contienen dos valores: {path: '/index', ip: '123.456.789'} Algunas de las rutas son las mismas, al igual que las ip. Algunos duplicados, algunas combinaciones únicas.
Quiero, para cada ruta única, la cantidad de direcciones IP diferentes adjuntas a esa ruta. Entonces, por ejemplo, puede haber 15 objetos con path: '/index' , pero solo 4 IP únicas para esa ruta.
En términos más simples, quiero encontrar la cantidad de visitantes únicos a una página de sitio web en particular.
Espero que esto tenga sentido, muchas gracias de antemano.
Editar:
Esto es lo que tengo hasta ahora, para generar vistas no únicas:
export const generateViews = (viewData: string): Map<string, number> => { const pathViewMap: Map<string, number> = new Map(); const viewDataArray = viewData.split("\n"); for (let i = 0; i < viewDataArray.length; i++) { const [path] = viewDataArray[i].split(" "); if (path) { if (pathViewMap.has(path)) { pathViewMap.set(path, pathViewMap.get(path) + 1); } else { pathViewMap.set(path, 1); } } } return pathViewMap; };Por contexto, la entrada es una cadena que proviene de un archivo de registro de una lista de rutas/ips
Edición 2:
Gracias a Peter Seliger, pude encontrar mi propia solución:
const viewDataArray = viewData.split("\n").filter((item) => item); const arr: { path: string; ip: string }[] = viewDataArray.map( (line: string) => { const [path, ip] = line.split(" "); if (path && ip) { return { path, ip }; } } ); const paths: string[] = Array.from(new Set(arr.map((obj) => obj.path))); const uniqueViewsMap: Map<string, number> = new Map(); for (let i = 0; i < paths.length; i++) { const path = paths[i]; const ips = Array.from( new Set(arr.filter((obj) => obj.path === path).map((obj) => obj.ip)) ); uniqueViewsMap.set(path, ips.length); } console.log("==uniqueViewsMap==", uniqueViewsMap); const sampleData = [ { path: '/index', ip: '123.456.789' }, { path: '/index/x', ip: '123.456.789' }, { path: '/index/', ip: '123.456.78' }, { path: '/index/y', ip: '123.456.789' }, { path: '/index/', ip: '123.456.89' }, { path: 'index/', ip: '123.456.9' }, { path: 'index', ip: '123.456.8' }, { path: '/index/', ip: '123.456.78' }, { path: '/index/x/', ip: '123.456.78' }, { path: 'index/x/', ip: '123.456.7' }, { path: 'index/x', ip: '123.456.6' }, ]; console.log( sampleData .reduce((result, { path, ip }, idx, arr) => { // sanitize/unify any path value path = path.replace(/^\/+/, '').replace(/\/+$/, ''); // access and/or create a path specific // set and add the `ip` value to it. (result[path] ??= new Set).add(ip); // within the last iteration step // transform the aggregated object // into the final result with the // path specific unique ip count. if (idx === arr.length - 1) { result = Object .entries(result) .reduce((obj, [path, set]) => Object.assign(obj, { [path]: set.size }), {} ); } return result; }, {}) );