Agree that it's unclear whether to make 'weight' or 'value' higher priority in copying, and it seems weird that 'value' would be generated based on the list of pre-existing 'weight's. (Shouldn't "value" be generated based on the list of pre-existing "value"s?)

This seems more sensible to me:

if (isset($params['weight'] && !isset($params['value'])) 
  $params['value'] = $params['weight'];
if (isset($params['value'] && !isset($params['weight'])) 
  $params['weight'] = $params['value'];
if (!isset($params['weight'])
  $params['weight'] = CRM_Utils_Weight::getDefaultWeight(..., ..., 'weight');
if (!isset($params['value'])
  $params['value'] = CRM_Utils_Weight::getDefaultWeight(..., ..., 'value');