基本上我想将解决方案:Python spliting a list based on a delimiter word移植到JavaScript。
Given: var example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'];
如果提供了WORD
的分隔符,我想生成:
var result = [['A'], ['WORD','B','C'],['WORD','D']];
是否可以通过列表循环来执行此操作?
答案 0 :(得分:1)
这应该按照你的要求进行
var tree = function (seq, breaks) {
var res = [], n;
for(var i = 0; i < seq.length; ) {
if(breaks.indexOf(seq[i]) != -1) {
for(var j = i+1; j < seq.length; j++) {
if(breaks.indexOf(seq[j]) != -1) {
break;
}
}
n = j;
var branch = tree(seq.slice(i+1, n), breaks);
branch.unshift(seq[i]);
res.push(branch);
i+=branch.length;
} else {
res.push([seq[i]]);
i++;
}
}
return res;
}
使用
tree(['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'], ['WORD'])
答案 1 :(得分:0)
这里最好的方法是首先记下算法,而不是进入特定的代码。有时这被称为伪代码。你试过写一些吗?这是一个例子:
从表格[[]]
的空结果开始。内部数组我们将调用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))
是否可以通过列表循环来执行此操作?
无论是你还是某些图书馆例程,都会有人循环。在第一种情况下,reduce
进行循环;在ES6代码中,它是生成器。