本质上,我想移植以下解决方案:Python spliting a list based on a delimiter word到 JavaScript。
给定:var example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'];
如果提供了 WORD
分隔符,我想生成:
var result = [['A'], ['WORD','B','C'],['WORD','D']];
除了遍历列表之外,还有其他方法吗?
最佳答案
这里最好的方法是先写下算法,而不是进入具体的代码。有时这称为伪代码。你试过写一些吗?这是一个例子:
从
[[]]
形式的空结果开始。我们将调用内部数组subarray
。查看输入的下一个单词。如果它是 'WORD',则向结果添加一个新的子数组并使其成为当前子数组。
将单词添加到当前子数组。
重复直到输入为空。
这种类型的算法,我们在数组上循环,并建立某种结果,正是 reduce
的设计目的。我们可以将上面的伪代码几乎直接转化成JS如下:
function split(array) {
var subarray = []; // subarray we are adding elts to
return array.reduce( // loop over the array
function(result, elt) { // and for each element
if (elt === 'WORD') // if it is word, then...
result.push(subarray = []); // start a new subarray and add to result
subarray.push(elt); // add the current element to the subarray
return result; // and return the updated result
},
[subarray]); // start off with an array with a single subarray
}
使用生成器
如果你在 ES6 环境中工作,你可以使用 ES6 生成器:
function* group(array) {
var subarray = [];
for (var elt of array) {
if (elt === 'WORD') {
yield subarray;
subarray = [];
}
subarray.push(elt);
}
yield subarray;
}
在这里,array
实际上可以是任何可迭代对象,因为我们使用 for..of
来获取它的值。
现在你可以打印出你的子数组了
for (grp of group(example)) console.log(grp);
或者创建一组数组:
Array.from(group(examples))
Is there an alternative to looping through the list to do this?
有人将不得不循环,无论是您还是某些库例程。在第一种情况下,它是 reduce
进行循环;在 ES6 代码中,它是生成器。
关于javascript - 如何使用分隔符从 JavaScript 中的单个列表创建子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30227366/