У меня есть массив, и я хотел бы разделить его на куски на основе заданной комбинации значений.
Например, у меня есть массив, содержащий только два разных значения: «Портрет» и «Пейзаж».
['Landscape', 'Landscape', 'Portrait', 'Portrait', 'Landscape', 'Portrait']
Условия, по которым я хотел бы, чтобы он был разделен, были бы
Итак, я ожидаю, что вывод будет выглядеть так:
[['Landscape', 'Landscape'], ['Portrait', 'Portrait'],['Landscape'], ['Portrait']
Перебрать массив и сгруппировать совпадающие элементы. Я бы предложил использовать Array.prototype.reduce, но цикл for может быть проще для начала.
Вы можете собрать ограничения для нового фрагмента в массиве и проверить, является ли одно из ограничений true
, а затем добавить новый фрагмент в набор результатов.
var array = ['Landscape', 'Landscape', 'Portrait', 'Portrait', 'Landscape', 'Portrait'],
constraints = [
(chunk, v) => v !== chunk[0],
(chunk, v) => v === 'Landscape' && chunk.length === 2,
chunk => chunk.length === 3
],
chunks = array.reduce((r, v) => {
var last = r[r.length - 1];
if (!last || constraints.some(fn => fn(last, v))) r.push(last = []);
last.push(v);
return r;
}, []);
console.log(chunks);
.as-console-wrapper { max-height: 100% !important; top: 0; }
sort как правило означает размещение массива в указанном порядке. Я думаю, вы хотите раздел на основе правил.