JSFiddle - React, Tailwind, and code Playground

JavaScript

var charlist = ['a', 'b', 'b', 'c', 'd', 'c', 'd', 'a'];
raw(charlist);

function raw(list) {
  var resultList = {};
  for (var i = 0; i < list.length; i++) {
    var item = list[i];
    var left = findSiblings(list, 0, i);
    var right = findSiblings(list, i + 1, list.length);
    var wrapperChars = charsBetween(item, left, right);
    resultList = addToResultList(resultList, item, wrapperChars);
  }

  printResult(resultList);
}

function printResult(resultList) {
  for (var item in resultList) {
    var line = getLine(resultList[item].length);
    document.write(line + item + '<br>');
  }
}

function addToResultList(list, item, wrappers) {
  var oldWrappers = list[item];
  if (oldWrappers !== undefined) {
    for (var i = 0; i < wrappers.length; i++) {
      var isExist = false;
      for (var j = 0; j < oldWrappers.length; j++) {
        if (wrappers[i] === oldWrappers[j])
          isExist = true;
      }
      if (!isExist) {
        list[item].push(wrappers[i]);
      }
    }
  } else {
    list[item] = wrappers;
  }
  return list;
}

function findSiblings(list, firstIndex, lastIndex, item) {
  var chars = [];
  for (var i = firstIndex; i < lastIndex; i++) {
    chars = addWithoutDuplicate(chars, list[i]);
  }
  return chars;
}

function addWithoutDuplicate(array, item) {
  var isExist = false;
  for (var i = 0; i < array.length; i++) {
    if (array[i] === item) isExist = true;
  }

  if (!isExist) array.push(item);
  return array;
}

function charsBetween(item, left, right) {
  var wrapperChars = [];
  for (var i = 0; i < left.length; i++) {
    for (var j = 0; j < right.length; j++) {
      if (left[i] === right[j]) {
        if (left[i] !== item) {
          wrapperChars = addWithoutDuplicate(wrapperChars, left[i]);
        }
      }
    }
  }
  return wrapperChars;
}

function getLine(count) {
  var lines = '';
  for (var i = 0; i < count; i++) {
    lines += '_';
  }
  return lines;
}