One way to go about describing what lodash is would be to say that it is a utility library. However calling it just that by itself is very vague, as a utility library can be a great many different things that provides all kinds of different sets of functionality.
Maybe one way to go about defining what a utility library is would be to say that it is a collection of methods on top of what is provided nativity. In addition this collection of methods brings something more to the table, functions in a different way compared to what is available natively, or just helps to ensure what should be there is in fact there.
For example say I find that a native method does not work the way that I want it to, I am now in a situation in which I have to write my own version of a native method. I then find myself writing that method over and over again each time I need it in a project, so then it makes sense to make that method part of my own utility library that I can link to each time I start a new project. However why bother even making my own utility library, it if just so happens that one all ready exists that has that method along with a whole bunch more.
Saying that lodash is a functional programing library is another way one could go about defining what lodash is. However it might still require a little elaboration beyond just saying that. Functional programing is a style of programing in which a functions output is the result of only its arguments. The same arguments will aways result in the same result being returned in so called pure functions that follow this functional programing rule. This is in contrast to imperative programming in which something weird involving application state, the scope chain or a class instance could result in a different result being returned even when called with the same arguments.
A big part of functional programing is having methods that do not mutate arguments. If you write a methods that takes an object as an argument what is returned is a new object that is created from that object, rather than mutating the given object. A good example of this would be the _.slice method and the native Array.prototype.slice method.
The _.slice method accepts an array as the first argument followed by starting and ending array index values that are to be used to create a new array from that given array.
Sure there is also the native slice array method that works more or less the same way, but then there are methods like splice that do not.
So by using lodash it forces me to think in a more functional rather than imperative way about my code when it comes to how functions should be designed.