如何使用分隔符在JavaScript中从单个列表创建子列表

时间:2015-05-14 00:23:14

标签: javascript arrays

基本上我想将解决方案: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']];

是否可以通过列表循环来执行此操作?

2 个答案:

答案 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)

这里最好的方法是首先记下算法,而不是进入特定的代码。有时这被称为伪代码。你试过写一些吗?这是一个例子:

  1. 从表格[[]]的空结果开始。内部数组我们将调用subarray

  2. 查看输入中的下一个单词。如果它是'WORD',则在结果中添加一个新的子数组并使其成为当前的子数组。

  3. 将单词添加到当前子阵列。

  4. 重复直到输入为空。

  5. 这种类型的算法,我们循环遍历数组,并构建某种结果,正是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代码中,它是生成器。