Как применить функции высшего порядка в JavaScript для циклического извлечения символов из строки?

У меня есть строка text = 'MNOPQRSTU' и число K = 3. Мне нужно получить результат 'PSVORUQTN' путем циклического обхода исходной строки с использованием значения K.

Логика работы:

text = MNOPQRSTU
Результат = P

text = MNOQRSTU  
Результат = PS

text = MNORSTU
Результат = PSV

text = MNORTU
Результат = PSVO

и так далее...

Вот мой текущий код:

function extractChars(text, K) {
  let chars = text.split('');
  let result = "";
  let counter = 0;
  let position = 0;
  
  while(chars.length > 0) {
    counter++;
    
    if(counter === K) { 
      result += chars.splice(position, 1);
      counter = 0;
      position = position - 1; 
    }
    
    if(position === chars.length - 1) { 
      position = -1; 
    }
    
    if(chars.length === 1) {
      result += chars.splice(0, 1);
    }
    
    position++;
  }
  
  return result;
}

extractChars("MNOPQRSTUV", 3);

Я новичок и хочу решить эту задачу используя функции высшего порядка в JavaScript (map, filter, reduce и т.д.). Но никак не могу понять как это сделать. Можете помочь переписать код используя эти функции? Если это невозможно, объясните почему такой подход не подойдет для данной задачи.

честно говоря, твоя задача плохо подходит под функции высшего порядка. map и filter работают с неизменяемыми данными, а тебе нужно постоянно менять массив и отслеживать позицию. я пробовал похожую задачу через reduce, но получилось очень громоздко и нечитаемо. твой подход с циклом намного понятнее и правильнее для такой логики. функции высшего порядка хороши для трансформации данных, но не для алгоритмов с изменяющимся состоянием как у тебя

Функции высшего порядка могут усложнить решение, так как надо следить за состоянием. Можно попробовать использовать reduce(), но это усложнит код. Лучше использовать цикл while() для ясности и простоты. Как ты считаешь, возможно ли адаптировать текущую логику?

Согласен с предыдущими ответами - это классический случай когда императивный подход лучше функционального. Я как-то пытался впихнуть reduce везде где только можно, но понял что это не всегда оправдано. В твоей задаче ключевая проблема в том, что нужно мутировать массив и помнить текущую позицию между итерациями. Функции типа map/filter создают новые массивы, а не изменяют существующие. Можно конечно через рекурсию с аккумулятором сделать, но код будет ужасный.