根据元素内容拆分数组?

Split array based on element contents?

假设我的元素是这样的:

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

我想要的是将其分成块,其中 'goose' 是块中的最后一个元素:

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

在 'goose' 之前有多少个元素没有规律性,每个元素中的内容也没有规律性,除了 1) goose 始终是元素的最后一部分,以及 2) goose 永远不会出现在任何其他元素中除了我想要一个块结束的那个(即我从来没有得到 'goose foo',但我可能会得到 'duck goose')

您可以通过简单的 forEach 循环来实现。在下面的示例中,我首先临时存储值。

然后如果单词包含 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)

试试这个。这应该可以满足您的需求。

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)

这是我想到的第一个解决方案。

我们一直将元素推入 temp 数组,直到我们得到一个包含单词 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)

这也行。

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

您可以减少数组并查看之前的字符串,然后将数组添加到新组的结果集中。

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