Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

218
Visualizações
Push into array inside reduced new Map()

I am trying to push to an array on a new Map() reduce from an array of objects, but for some reason it pushes only two items per array.

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; }

Expected output

Map(2) {
  'engines' => [ 'google.com', 'duckduckgo.com'],
  'pc' => [ 'mac.com', 'linux.com', 'windows.com']
}

I dont even know why the snippet does not work on stackoverflow, it works fine on editor.

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

This gives you the correct output.

You need to use a new array for each keyword; otherwise you're sharing a single object and corrupting it as you go.

StackOverflow's REPL does not output Map content in the same way as browsers when using console.log, so I used a workaround to display the data.

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; }

about 4 years ago · Juan Pablo Isaza Relatório

0

Here is a compact implementation that will produce your output

data.reduce(
  (a, o) => a.set(o.keyword, [...a.get(o.keyword) || [], o.url]), 
  new Map()
)
about 4 years ago · Juan Pablo Isaza Relatório

0

I fixed it with this but is does not feel right

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)

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda