Проблема
const someLog: Record<number, string[]> = { 1: ["Header 1", "value", "here"], 2: ["Header 2", "extra"], 3: ["Header 3"], 4: ["Header 4"], 5: ["Header 5"], }
Я использовал этот тип записи для хранения массива строк для каждого ключа. Первым элементом был заголовок для каждого массива (я знаю, что, вероятно, есть лучший способ сделать это, но я сделал это на данный момент). Мне нужно было объединить все эти массивы и показать только те массивы, в которых есть какое-то значение. Поэтому, если у массива есть только заголовок, я не хочу помещать его в основной массив.
Попытка №1
const masterList = Object.values(gameLog).map(val => val); // Output const masterList = [["Header 1", "value", "here"], ["Header 2", "extra"], ["Header 3"], ["Header 4"], ["Header 5"]]
Я успешно объединил массивы, но теперь у меня есть массив массивов. Другими словами, это строка[][] 😔. Мне нужно было объединить это в один массив, просто строку [].
Попытка №2
const masterList = Object.values(gameLog).map(val => val).flat(1); // Output const masterList = ["Header 1", "value", "here", "Header 2", "extra", "Header 3", "Header 4", "Header 5"]
Хорошо, это сработало… но я хочу отфильтровать массивы, у которых есть только заголовок. Я просто хочу отображать массивы с заголовком + значением.
Решение
const data = Object.values(gameLog).map(val => val.length > 1 ? val : []).flat(1); // Output const masterList = ["Header 1", "value", "here", "Header 2", "extra"]
Наконец 🥳! Ключевым моментом здесь было вызвать функцию flat(), чтобы поместить значения в один массив, а затем вызвать условное выражение, которое вернет массив из объекта только в том случае, если значений больше, чем просто заголовок.
Заключение
Это не огромный прорыв, но я думаю, что это отличная демонстрация того, как вы можете использовать функциональное программирование Javacript и Typescript, вызывая его встроенные функции для манипулирования данными, как вы хотите, в своем программном обеспечении.