computeFeaturesMeta = (
  x,
  resolution = FEATURE_HISTOGRAM_RESOLUTION
) => {
  return Object.keys(x[0])
    .map(featureName => {
      const values = x.map(d => d[featureName]);
      return computeFeatureMeta(featureName, values, resolution);
    })
    .filter(
      // ignore features with too may categories, like uuid; ignore features with only one category
      feature => feature.type !== null
    );
}
compute basic information of features
@param {Array<Object>} x - An array of objects, csv raw feature data.
@return {Array<Object>} feature fields (only valid features are kept). Each object has keys `name` `type` `dataType` `domain`