Как разбить массив на основе определенных комбинаций массивов?

У меня есть массив, и я хотел бы разделить его на куски на основе заданной комбинации значений.

Например, у меня есть массив, содержащий только два разных значения: «Портрет» и «Пейзаж».

['Landscape', 'Landscape', 'Portrait', 'Portrait', 'Landscape', 'Portrait']

Условия, по которым я хотел бы, чтобы он был разделен, были бы

  • Размер фрагментированного массива <= 3.
  • Чанк может иметь только «Пейзаж» <= 2.
  • «Пейзаж» и «Портрет» не могут находиться в одном фрагменте.

Итак, я ожидаю, что вывод будет выглядеть так:

[['Landscape', 'Landscape'], ['Portrait', 'Portrait'],['Landscape'], ['Portrait']

sort как правило означает размещение массива в указанном порядке. Я думаю, вы хотите раздел на основе правил.

Davin Tryon 22.05.2019 15:16

Перебрать массив и сгруппировать совпадающие элементы. Я бы предложил использовать Array.prototype.reduce, но цикл for может быть проще для начала.

Patryk Cieszkowski 22.05.2019 15:19
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете собрать ограничения для нового фрагмента в массиве и проверить, является ли одно из ограничений 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; }

Другие вопросы по теме