Search code examples
javascriptarrayslodash

Optimize a deep and map function in JS


Given the following Map:

const myMap = new Map([
    [“a”, [{
        files: [{
            name: “f1a”
        }, {
            name: “f2a”
        }]
    }]],
    [“b”, [{
        files: [{
            name: “f1b”
        }, {
            name: “f2b”
        }]
    }]]
]);

I need to have the following result:

[{
    "name": "f1a"
}, {
    "name": "f2a"
}, {
    "name": "f1b"
}, {
    "name": "f2b"
}]

I achieved that using:

[...x.values()].flat().map(x => x.files).flat()

How can the above be optimized, can even use lodash I don't mind.

I tried to use lodash: flattenMapDeep

but didn't work


Solution

  • You can use Array#[flat, flatMap]:

    const myMap = new Map([
      ['a', [{
        files: [{
          name: 'f1a'
        }, {
          name: 'f2a'
        }]
      }]],
      ['b', [{
        files: [{
          name: 'f1b'
        }, {
          name: 'f2b'
        }]
      }]]
    ])
    
    // Your code.. 
    const result1 = [...myMap.values()].flat().map(x => x.files).flat()
    console.log('Result1', result1)
    
    // Using Array#[flat, flatMap] (((Fastest)))
    const result2 = [...myMap.values()].flat().flatMap(x => x.files)
    console.log('Result2', result2)