Подскажите как можно сжать серии массива, состоящего из единиц и нулей по такому принципу: [1,1,1,1,0,0,0,0,0,0,1,1,1,1] переобразовать в [4,6,4,]?
Помогите понять, как можно сжать серии массива, состоящего из единиц и нулей по такому принципу: массив [1,1,1,1,0,0,0,0,0,0,1,1,1,1] преобразуется в [4,6,4,]?
Ответы (4 шт):
Автор решения: Алексей Шиманский
→ Ссылка
- Ещё один массив и счётчик ставим на 1
- Цикл по текущему начиная со второго элемента
- Если текущий элемент равен предыдущему - счётчик +1, если нет - заносим в массив и счётчик ставим на 1
учитывайте, что в массиве может быть 0 элементов или 1.
Автор решения: gil9red
→ Ссылка
Нужно перебирать массив, считая сколько раз повторяется элемент
Но мне было интересно сделать через регулярку. Если представить массив как последовательность подряд идущих символов, то можно сделать регулярку, что находит их:
let arr = [1,1,1,1,0,0,0,0,0,0,1,1,1,1];
let text = arr.join('');
console.log(text);
let matches = text.matchAll(/(.)\1*/g);
let items = [];
for (m of matches) {
items.push(m[0].length);
}
console.log(items);
UPD. По совету, Qwertiy. Можно упростить, используя функции match и map:
let arr = [1,1,1,1,0,0,0,0,0,0,1,1,1,1];
let items = arr.join("").match(/(.)\1*/g).map(x => x.length);
console.log(items);
Автор решения: Qwertiy
→ Ссылка
var a = [1,1,1,1,0,0,0,0,0,0,1,1,1,1]
var b = a.reduce((r,x,i,a) => ((x===a[i-1] ? ++r[r.length-1] : r.push(1)), r), [])
console.log(b)
Автор решения: entithat
→ Ссылка
Императивный подход:
const arr = [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]; // 4 6 4
function getCounts(arr) {
let res = [1];
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i + 1]) {
res[res.length - 1]++;
} else {
res.push(1);
}
}
return res;
}
console.log(getCounts(arr));
Функциональный подход:
const arr = [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]; // 4 6 4
console.log(arr.reduce((a, c, i) => (c === arr[i + 1] ? a[a.length - 1]++ : a.push(1), a), [1]).slice(0, -1));