@mrSeller

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

Есть массив элементов, которые надо вывести плиткой.
Плитка не динамическая, задана изначальным дизайном.
Размеры (кол-во элементов) строк в плитке подчиняются такой закономерности: 2-3-3-2-3-3-2-3-3-2 и т.д.
Когда 2 элемента в строке - всегда одинаковый вывод, когда 3 - там уже есть вариации (всего их три), т.е. нужно в подмассивы еще добавлять тип.

Полчаса думаю над кодом, но в голову ничего не лезет, даже как начать не знаю, хотя задача изначально казалась довольно простой.
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
i := 0
пока исходный массив не пуст
  если i == 0
    то отрезать 2 элемента
    иначе отрезать 3 элемента
  i := (i + 1) % 3
Ответ написан
Комментировать
@mrSeller Автор вопроса
Накинул пока такую функцию, висит проблема с тем, что количество элементов может не соответствовать плите, значит надо привносить динамику.
Рефакторинг, естественно, в последнюю очередь

Функция

getTile() {
  let topics = this.topics.slice(0)
  let tile = []
  let types = ['double', 'triple', 'triple-left', 'triple-right']
  let regularity = [0,1,2,0,1,3]
  let i = 0 // regularity iterator
  let obj

  while(topics.length) {
    let type = types[regularity[i]]

    switch(type) {
      case 'double':
        obj = resetObj(type)
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        tile.push(obj)
        break

      case 'triple':
        obj = resetObj(type)
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        tile.push(obj)
        break

      case 'triple-left':
        obj = resetObj(type)
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        tile.push(obj)
        break

      case 'triple-right':
        obj = resetObj(type)
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        obj.array.push(topics.shift())
        tile.push(obj)
        break
    }

    // reset regularity iterator
    if (i === 5) {
      i = 0
    } else {
      i++
    }

    function resetObj(type) {
      return {
        type,
        array: []
      }
    }
  }

  return tile
}

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы