У меня есть массив шагов, в примере я буду использовать буквы:уменьшая массив шагов до меньшего массива
let steps=['f', 'b', 'c', 'd', 'x', 'h', 'i' ]
и функцию объединения, которая принимает два шага и возвращаю слит шаг, если он может объединить их или нуль, если он не может, в качестве примера будет Concat два последовательных букв:
function nextLetter(s){
return s.replace(/([a-zA-Z])[^a-zA-Z]*$/, function(a) {
var c= a.charCodeAt(0);
if (c===90 || c===122) return null; else return String.fromCharCode(++c);
}
});
}
// merge('x', 'a') -> null , marge('x', 'y') -> 'xy'
function mergeSteps(s1, s2) {
if (s2==nextLetter(s1)) return s1+s2; else return null;
}
мне теперь нужно написать mergeStepsArray
функции, это будет получить массив шагов и возвращает новый массив пытаясь объединить как можно больше последовательных шагов, с тем чтобы шаги массива выше:
mergeStepsArray(steps, mergeSteps);
вернется ['f', 'bcd', 'x', 'hi' ]
Как я могу написать такую функцию эффективно? Я пытался использовать Array.reduce, но я не могу заставить его работать в этом случае.
ПРИМЕЧАНИЕ: Мне нужен mergeStepsArray(steps, mergeSteps)
, который является общим и не знает особенностей его аргументов. Например шаги могут быть сделаны из цифр и mergeSteps мог return s2==s1*2 ? s1*s2 : null
Благодарности
Может использовать разъяснение, если это слияние рекурсивны? IE ''bcd ...''? Или просто одна итерация? – Enfyve
да, должно быть, я обновлю свой вопрос, thx – kofifus
вопрос должен иметь больше смысла – kofifus