_.concat(array, [values])

Создает новый массив, объединяющий array с любыми дополнительными массивами и/или значениями.
Полную документацию по этому методу см. здесь.

Кое-что в приведенном выше описании не упоминается явно: все переданные значения выравниваются на глубину 1 перед конкатенацией. Это заставило меня несколько раз перечитать примеры на странице документации, прежде чем я понял, что происходит. Обычно я бы сказал, что это неожиданное поведение, но я понимаю, что если вы передаете несколько массивов в качестве значений, вы, вероятно, пытаетесь объединить содержимое этих массивов, а не сами массивы.

Я снова нарушил собственные правила, используя как дополнительный массив, так и flat(), но, по крайней мере, я понял и знал, почему я это делаю: у меня отвращение к написанию двойных for() циклов. Меня не покидает ощущение, что это опасная и плохая практика, даже если они прекрасно решают некоторые задачи (а именно эту).

В любом случае, вышеуказанное решение сработало… но я знал, что мне нужно его подтянуть. Поэтому я пересмотрел его со следующим:

Здесь мы проверяем наличие массивов в списке аргументов. Этот двойной for() позволяет нам перебирать внутренности указанных массивов и индивидуально добавлять их содержимое к результату. Это устраняет необходимость в дополнительном массиве, который мы впоследствии сглаживаем.

Примерно в это же время я начинаю писать тестовые примеры, проверяя результат своего метода на результат Lodash. Цель, конечно, в том, чтобы они точно совпадали. Довольно быстро я столкнулся с проблемами при передаче: аргумент одного пустого массива, неопределенный и любой первый переданный аргумент, который не был массивом. Очевидно, мне нужно было больше проверок безопасности на входах.

Этот тернарный оператор позволяет нам перехватывать все, что передается, кроме массива, а следующий if() просто возвращает пустой массив, если в качестве входных данных ничего не передается. На самом деле это немного приближает нас к реализации Lodash… вроде того. Оказывается, они на самом деле используют что-то вроде моего первого решения с flat() . И, естественно, они предпочитают while() for(), что еще не покорило меня, но я начинаю это усваивать.

Для этого нет CodePen, но вы всегда можете заглянуть на Github!