#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)