Search code examples
lodashdistinct-values

Select distinct child array properties LoDash


With the following model structure:

prods: [{
        code: 'ABC123',
        name: 'Product 1',
        variants[{
                code: 'V123',
                name 'Var 1'
            }, {
                code: 'V456',
                name 'Var 2'
            }, {
                code: 'V789',
                name 'Var 3'
            }
        ]
    }, {
        code: 'DEF456',
        name: 'Product 2',
        variants[{
                code: 'V098',
                name 'Var 4'
            }, {
                code: 'V123',
                name 'Var 1'
            }, {
                code: 'V123',
                name 'Var 1'
            }
        ]
    }, {
        code: 'XYZ123',
        name: 'Product 3',
        variants[{
                code: 'V123',
                name 'Var 1'
            }, {
                code: 'V456',
                name 'Var 2'
            }, {
                code: 'V789',
                name 'Var 3'
            }
        ]
    }
]

Is it possible to get an array of the unique variant codes, so would expect output to give me:

[{code:'V123'},{code: 'V456'}, {code: 'V789'},{code: 'V098'}]


Solution

  • You can chain together map(), flatten(), and uniqBy():

    _(prods)
      .map('variants')
      .flatten()
      .uniqBy('code')
      .map(i => _.pick(i, 'code'))
      .value();
    

    The second map() call isn't strictly necessary - it's just to get rid of the name property to match your requested output.