Как преобразовать Alphanumeri c значения в диапазоны значений в Typescript? - PullRequest
0 голосов
/ 22 апреля 2020
myArray = ["AB01","AB02","AB03","AB04","AB11","BC12","BC13", "SB33"];

// expected string "AB01-AB04, AB11, BC12-BC13, SB33"

Буквы могут состоять из одного или двух символов. Цифры могут состоять из двух или трех символов. Пример: A001, A002, AB001, AB002, AC01, AC02, B01, B02.

Возможны только эти форматы.

Как добиться этого в упрощенном порядке?

1 Ответ

0 голосов
/ 23 апреля 2020

let myArray = ["AB01","AB05","ABCDEFG01123","ABCDEFG01124","AB02","AB03","AB04","AB11","BC12","BC13", "SB33"];

function getRanges(array, group) {
  var ranges = [], rstart, rend;
  for (var i = 0; i < array.length; i++) {
    rstart = array[i];
    rend = rstart;
    while (array[i + 1] - array[i] == 1) {
      rend = array[i + 1];
      i++;
    }
    ranges.push(rstart == rend ? group+rstart+'' : group+rstart + '-' + group+rend);
  }
  return ranges;
}

// group first.
let groups = myArray.reduce((groups,item)=>{
  let belongsTo = item.match(/[a-zA-Z]/g).join('');
  groups[belongsTo] ? groups[belongsTo].push(item) :groups[belongsTo]=[item];
  return groups;
},{})

let expectedString = Object.entries(groups).reduce((output,[key,value])=>{
  output=`${output}${output.length ? ', ' : ''}${getRanges(value.map(i=>i.match(/[0-9]/g).join('')),key)}`;
  return output;
},'');

console.log(expectedString);
// expected string "AB01-AB04, AB11, BC12-BC13, SB33"
...