根据元素内容拆分数组?
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; }
假设我的元素是这样的:
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; }