var convertToRanges = function (str) {
// split the string at the commas and map it to an array of ints
// NOTE: if you are passing an array, skip this step
var pieces = str.split(",").map(Number)
// ranges will be an array of arrays
// each inner array will have 2 dimensions, representing the start/end
// of a range
// we want to initialize our first range to pieces[0], pieces[0],
// or (only the first element)
, ranges = [[pieces[0], pieces[0]]]
// last index we accessed (so we know which range to update)
, lastIndex = 0;
for (var i = 1; i < pieces.length; i++) {
// if the current element is 1 away from the end of whichever range
// we're currently in
if (pieces[i] - ranges[lastIndex][1] === 1) {
// update the end of that range to be this number
ranges[lastIndex][1] = pieces[i];
} else {
// otherwise, add a new range to ranges
ranges[++lastIndex] = [pieces[i], pieces[i]];
}
}
return ranges;
}
Это возвращает массив массивов:
console.log(convertToRanges("1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19"));
// -> [ [1, 4], [6, 9], [11, 14], [16, 19] ]
Я оставлю вас, чтобы выяснить, как превратить это выглядеть "1-4,6-9,11-14,16-20"
Подсказка: используйте Array.prototype.map
и Array.prototype.join
Что youtried? –
Я выполнил многочисленные поисковые запросы Google, и я продолжаю сталкиваться с RegEx, чего я еще не изучил, но после краткого обзора его я не уверен на 100%, что это решение моей проблемы на основе примеров I продолжайте сталкиваться. Я столкнулся с одним решением, которое включало в себя многочисленные if else-выражения внутри цикла, которые генерировали числа, и идея была почти щелкает в моей голове, однако решение было написано на PHP, и попытка расшифровать и перевести на JS сделала только мои мозг больнее. По сути, я еще не пробовал, поскольку подход еще не нажал. – bdorrance