Проблема

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, вызывая его встроенные функции для манипулирования данными, как вы хотите, в своем программном обеспечении.