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

标签 javascript arrays

本质上,我想移植以下解决方案: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']];

除了遍历列表之外,还有其他方法吗?

最佳答案

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

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

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

  3. 将单词添加到当前子数组。

  4. 重复直到输入为空。

这种类型的算法,我们在数组上循环,并建立某种结果,正是 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/

相关文章:

javascript - AngularJS 模块不加载

c - 用 scanf 填充 C 中的大数组

java - 为什么数组似乎比它的最大长度长?

javascript - 使用ajax请求上传文件

javascript - 客户端 javascript 驱动的网站

arrays - Office Excel 中的 Makearray 函数无法为数组生成适当数量的列

java - 数组计数器不适用于java

c# - 使用 linq 将 xml 文件加载到二维矩形数组中

javascript - 尝试获取扩展程序中页面的 URL,但 chrome.tabs.getSelected() 返回未定义

javascript - 如何在 Vue 中停止组件加载和重定向?