Оптимизация глубокой и картографической функции в JS

#javascript #arrays #lodash

Вопрос:

Учитывая следующую карту:

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

Мне нужно получить следующий результат:

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

Я достиг этого, используя:

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

Как можно оптимизировать все вышесказанное, можно даже использовать lodash, я не возражаю.

Я попытался использовать lodash: flattenMapDeep

но ничего не вышло

Комментарии:

1. На мой взгляд, выглядит разумно

2. Да, однако я обнаружил, что другим разработчикам это несколько сложно, я думал об использовании flattenMapDeep, или значений карты, или чего-то в этом роде… из lodash

3. [...myMap.values()].flat().flatMap(x => x.files)

4. Логически говоря, ваше решение является наиболее читаемым и понятным для выполнения задачи. За исключением последней части, где map следуют flat звонки, это может быть превращено в flatMap звонок. AFA, другие разработчики и их сложность в понимании этого, безусловно, связаны с тем Map#values() , Array#flat что делают, и аналогичные API.

Ответ №1:

Вы можете использовать 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)