This is a really common error that you'll almost certainly encounter again, but the reason for it varies. It is usually caused by data that is loaded asynchronously, meaning at the beginning the data is empty (in your case tracks) and later on it gets filled with an array, but there are other causes too which I will explain later.
There are several methods to make sure this doesn't break your app.
The quick and dirty way is to just check that the data is truthy before accessing properties: data && data.map. I only recommend doing this if there is no better way available, it can sometimes hide an error instead of fix it.
Personally I think the best practice is to make sure your variables are defaulted to empty structures representing what the data will look like. It looks like you already do this in your App.js by defaulting both searchResults and playlistTracks to be arrays in state.
The reason I prefer this, is that now if you still get an error, you know the problem is not an async issue, but something else. Such as forgetting to pass a prop a few levels up (App.js):
<SearchResults searchResults = {this.state.searchResults}/>
//<Playlist/>
<Playlist tracks={this.state.playlistTracks} /> // Pass it the prop it needs
Playlist attempts to give TrackList the prop tracks from this.props.tracks, but it was never given that prop from App.js so it is undefined.
<TrackList tracks = {this.props.tracks}/> // this.props.tracks is undefined from App
This is why you have the error "Cannot read property .map of undefined". Simply checking if this.props.tracks is not undefined will stop the error, but will hide the bug!