Digamos que mis elementos se ven así:
const words = [ 'duck foo bar', 'duck', 'duck bing ', 'bing', 'Bloop#12 goose', 'duck 12', 'duck goose', ... ]Lo que me gustaría es dividir esto en partes donde 'ganso' es el elemento final en una parte:
const words = [ [ 'duck foo bar', 'duck', 'duck bing', 'bing', 'Bloop#12 goose', ], [ 'duck 12', 'duck goose', ], [ ... ], ];No hay regularidad en cuántos elementos preceden a un 'ganso', ni qué hay en cada elemento, excepto que 1) el ganso siempre es la última parte de un elemento, y 2) el ganso nunca aparece en ningún otro elemento además del que quiero un trozo para terminar (es decir, nunca obtengo 'goose foo', pero podría obtener 'duck goose')
Podría reducir la matriz y echar un vistazo a la cadena anterior y agregar una matriz al conjunto de resultados para un nuevo grupo.
const words = ['duck foo bar', 'duck', 'duck bing ', 'bing', 'Bloop#12 goose', 'duck 12', 'duck goose'], separator = 'goose', groups = words.reduce((r, s, i, a) => { if (!i || a[i - 1].includes(separator)) r.push([]); r[r.length - 1].push(s); return r; }, []); console.log(groups); .as-console-wrapper { max-height: 100% !important; top: 0; }Prueba esto. Esto debería hacer lo que estás buscando.
const words = [ 'duck foo bar', 'duck', 'duck bing ', 'bing', 'Bloop#12 goose', 'duck 12', 'duck goose' ] const answer = [] let temp = [] for(let i = 0; i < words.length; i++){ if(words[i].includes('goose')){ temp.push(words[i]) answer.push(temp) temp = [] } else{ temp.push(words[i]) } } console.log(answer)Puede lograr esto con un bucle forEach simple. En mi ejemplo a continuación, almaceno los valores primero temporalmente.
Luego empujo el trozo a la nueva matriz si la palabra contiene goose .
const words = [ 'duck foo bar', 'duck', 'duck bing ', 'bing', 'Bloop#12 goose', 'duck 12', 'duck goose', 'abc' ] const n = [] let tmp = []; words.forEach((w) => { if (! w.includes('goose')) { tmp.push(w); } else { tmp.push(w); n.push(tmp); tmp = []; } }); console.log(n)