How to remove data from a Google Maps Data Layer?

This worked for me:

map.data.forEach(function(feature) {
    // filter...
    map.data.remove(feature);
});

While map.data is designed as a placeholder for the common case of a single datasource, you can have multiple, and still use addGeoJSon using something like:

// load data - do the same for data2, data3 or whatever
data1 = new google.maps.Data();
data1.loadGeoJson(url1);

// create some layer control logic for turning on data1
data1.setMap(map) // or restyle or whatever

// turn off data1 and turn on data2
data1.setMap(null) // hides it
data2.setMap(map) // displays data2

You are correct in that the Data Layer is a single layer. However, if you manually retrieve the GeoJSON and use the addGeoJson function instead of loadGeoJson you will get the added features returned. You can remove these later on.

So instead of

map.data.loadGeoJson('https://storage.googleapis.com/maps-devrel/google.json');

You can do something like this (this example uses jQuery to get the data and assumes there is a button with the ID removeBtn):

// Load the GeoJSON manually (works cross-origin since google sets the required HTTP headers)
$.getJSON('https://storage.googleapis.com/maps-devrel/google.json', function (data) {
  var features = map.data.addGeoJson(data);

  // Setup event handler to remove GeoJSON features
  google.maps.event.addDomListener(document.getElementById('removeBtn'), 'click', function () {
    for (var i = 0; i < features.length; i++)
      map.data.remove(features[i]);
  }); 
}); 

(See this JSbin for a working example you can play around with)

In more complex circumstances, you probably have to keep track of which datasource the user loaded and the features that got created because of that so you can delete them when requested.