Dada la siguiente matriz:
foos = [ { id: 0, bar: ['a','b','c'] }, { id: 1, bar: ['a','b','d'] }, { id: 2, bar: ['a','c'] }, ] Usando reduce , ¿cómo puedo lograr lo siguiente?:
bars == ['a','b','c','d']
He intentado:
foo.reduce((bars, foo) => bars.add(foo.bar), new Set())
Pero da como resultado un conjunto de objetos:
Set { {0: 'a', 1: 'b', 2: 'c'}, {0: 'a', 1: 'b', 2: 'd'}{0: 'a', 1: 'c'}}
Y:
foos.reduce((bars, foo) => foo.bar.forEach(bar => bars.add(bar)), new Set())
Pero forEach no tiene acceso al conjunto de bars .
En lugar de crear un Set dentro de tu reduce . Podría simplemente reducir todas las matrices de bar en una sola y pasarla a su constructor de conjuntos.
const foos = [ { id: 0, bar: ['a','b','c'] }, { id: 1, bar: ['a','b','d'] }, { id: 2, bar: ['a','c'] }, ]; const bars = new Set(foos.reduce((all, foo) => [...all, ...foo.bar], [])); console.log(...bars);Con mapa plano :
const foos = [ { id: 0, bar: ['a','b','c'] }, { id: 1, bar: ['a','b','d'] }, { id: 2, bar: ['a','c'] }, ]; const bars = new Set(foos.flatMap(foo => foo.bar)); console.log(...bars);Puede concat la propiedad de la bar en el acumulador y usar el método .filter para hacer que los valores sean únicos:
const foos = [{ id: 0, bar: ['a', 'b', 'c'] }, { id: 1, bar: ['a', 'b', 'd'] }, { id: 2, bar: ['a', 'c'] }, ]; const bars = foos .reduce((acc, itm) => acc.concat(itm.bar), []) .filter((i, x, s) => s.indexOf(i) === x); console.log(...bars);