1

Let's say my elements look like this:

const words = [
 'duck foo bar',
 'duck',
 'duck bing ',
 'bing',
 'Bloop#12 goose',
 'duck 12',
 'duck goose',
  ...
]

What I'd like is to split this into chunks where 'goose' is the final element in a chunk:

const words = [
 [
   'duck foo bar',
   'duck',
   'duck bing',
   'bing',
   'Bloop#12 goose',
 ], 
 [
   'duck 12',
   'duck goose',
 ], 
 [
  ...
 ],
];

There's no regularity to how many elements precede a 'goose', nor what is in each element except that 1) goose is always the last part of an element, and 2) goose never appears in any other element besides the one I want a chunk to end on (i.e. I never get 'goose foo', but I might get 'duck goose')

2
  • what is the problem (with your code)? Commented Mar 31, 2022 at 12:04
  • @NinaScholz if I'm honest, I got mixed up and tried to use array.split('goose') which is so nonsensical it wasn't worth posting Commented Mar 31, 2022 at 15:06

5 Answers 5

2

You could reduce the array and have a look to the previous string and add an array to the result set for a new group.

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; }

Sign up to request clarification or add additional context in comments.

Comments

1

Try this. This should do what you're looking for.

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)

Comments

0

Here's the first solution that came up in my mind.

We keep pushing elements to temp array until we get a string containing the word goose.

const words = [
 'duck foo bar',
 'duck',
 'duck bing ',
 'bing',
 'Bloop#12 goose',
 'duck 12',
 'duck goose',
];

const splits = [];
let temp = [];

words.forEach(word => {
 if(word.includes('goose')) {
    temp.push(word);
  splits.push(temp);
  temp = [];
 } else {
    temp.push(word);
 }
})

console.log(splits)

Comments

0

This would also work.

const words = [
  "duck foo bar",
  "duck",
  "duck bing ",
  "bing",
  "Bloop#12 goose",
  "duck 12",
  "duck goose",
];

const output = [];

let chunk = [];
words.forEach((item) => {
  const splits = item.split(" ");
  const last =  splits[splits.length - 1];
  if(last === "goose") {
    chunk.push(item)
    output.push(chunk)
    chunk = [];
  } else {
    chunk.push(item)
  }
})

console.log(output);

Comments

0

You can achieve this with a simple forEach loop. In my example below I store the values first temporally.

Then I push the chunk into the new array if the word contains 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)

1 Comment

@AncientSwordRage Thank you for editing. My english is horrible. Hope my code helps a little bit?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.