Estoy tratando de empujar a una matriz en una new Map() de una matriz de objetos, pero por alguna razón solo empuja dos elementos por matriz.
const data = [ { keyword: 'engines', url: 'google.com', }, { keyword: 'engines', url: 'duckduckgo.com', }, { keyword: 'pc', url: 'mac.com', }, { keyword: 'pc', url: 'linux.com', }, { keyword: 'pc', url: 'windows.com', } ] let urls = [] const mapper = data.reduce((acc, obj) => { urls.push(obj.url) if (!acc.has(obj.keyword)) { acc.set(obj.keyword, urls ) } else { urls = [] } return acc }, new Map()) console.log(mapper) .as-console-wrapper { max-height: 100% !important; top: 0; }Rendimiento esperado
Map(2) { 'engines' => [ 'google.com', 'duckduckgo.com'], 'pc' => [ 'mac.com', 'linux.com', 'windows.com'] }Ni siquiera sé por qué el fragmento no funciona en stackoverflow, funciona bien en el editor.
Esto le da la salida correcta.
Debe usar una nueva matriz para cada palabra clave; de lo contrario, está compartiendo un solo objeto y corrompiéndolo a medida que avanza.
REPL de StackOverflow no muestra el contenido del Map de la misma manera que los navegadores cuando usan console.log , así que usé una solución alternativa para mostrar los datos.
const data = [ { keyword: 'engines', url: 'google.com', }, { keyword: 'engines', url: 'duckduckgo.com', }, { keyword: 'pc', url: 'mac.com', }, { keyword: 'pc', url: 'linux.com', }, { keyword: 'pc', url: 'windows.com', } ] const mapper = data.reduce((acc, obj) => { if (!acc.has(obj.keyword)) { acc.set(obj.keyword, [] ) } let urls = acc.get(obj.keyword) urls.push(obj.url); return acc; }, new Map()) /** Expected output per OP: Map(2) { 'engines' => [ 'google.com', 'duckduckgo.com'], 'pc' => [ 'mac.com', 'linux.com', 'windows.com'] } */ console.log([...mapper.entries()]) .as-console-wrapper { max-height: 100% !important; top: 0; }Aquí hay una implementación compacta que producirá su salida
data.reduce( (a, o) => a.set(o.keyword, [...a.get(o.keyword) || [], o.url]), new Map() )Lo arreglé con esto pero no se siente bien
const data = [ { keyword: 'engines', url: 'google.com', }, { keyword: 'engines', url: 'duckduckgo.com', }, { keyword: 'pc', url: 'mac.com', }, { keyword: 'pc', url: 'linux.com', }, { keyword: 'pc', url: 'windows.com', } ] let urls = [] const mapper = data.reduce((acc, obj) => { if (!acc.has(obj.keyword)) { urls = [] } urls.push(obj.url) acc.set(obj.keyword, urls ) return acc }, new Map()) console.log(mapper)