In this lesson, we'll grab arrays of values from other arrays, resulting in a nested array. From there, we'll look at multiple ways to flatten the array structure using composition with map
and unnest
and then refactoring to use chain
, AKA flatMap
. Finally, we'll add Ramda's uniq
function to remove duplicate values.
const R = require('ramda'); const {map, chain, prop, pluck, compose, uniq, tap, curry} = R; const product = { name: "Sample Data", sizes: [ { name: "L", colors: [ { name: "Red" }, { name: "Blue" } ] }, { name: "M", colors: [ { name: "Green" }, { name: "Yellow" } ] }, { name: "S", colors: [ { name: "Orange" }, { name: "Purple" }, { name: "Blue" } ] } ] }; const log = curry((desc, x) => R.tap(() => console.log(desc, JSON.stringify(x, null, 2)), x)); // Target: to get unique array of color from product object const sizes = prop('sizes'); const getColors = chain(prop('colors')); // flatMap, get colors props from array of objects const getColorNames = pluck('name'); // get name prop from array of objects const res = compose( uniq, log("after name"), getColorNames, log("after colors"), getColors, log("after sizes"), sizes )(product); console.log(JSON.stringify(res, null, 2)); /* * after sizes [ { "name": "L", "colors": [ { "name": "Red" }, { "name": "Blue" } ] }, { "name": "M", "colors": [ { "name": "Green" }, { "name": "Yellow" } ] }, { "name": "S", "colors": [ { "name": "Orange" }, { "name": "Purple" }, { "name": "Blue" } ] } ] after colors [ { "name": "Red" }, { "name": "Blue" }, { "name": "Green" }, { "name": "Yellow" }, { "name": "Orange" }, { "name": "Purple" }, { "name": "Blue" } ] after name [ "Red", "Blue", "Green", "Yellow", "Orange", "Purple", "Blue" ] [ "Red", "Blue", "Green", "Yellow", "Orange", "Purple" ] * */