按特定顺序分隔数组中的字符串

时间:2018-06-14 22:18:52

标签: javascript typescript

我有一个从转换后的CHANGELOG.md文件中获取的列表,它看起来像这样:

["[3.0.0]","Features", "changes done in file","[2.0.1]", "Bug Fixes", "fixed login"]

我想要做的是将每个版本分成自己的列表,如下所示:

["[3.0.0]", "Features", "changes done in file"],
["[2.0.1]", "Bug Fixes", "fixed login"]

显然,因为它是一个更改日志,单个版本中可能有多个功能和多个错误修正,所以我想要一段代码来适当地分隔代码。

我尝试使用if (string.startsWith('[')),但我无法设法将其放入循环中。

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

这是我想出的一些东西。代码基本上遍历输入数组,并将每个字符串添加到currentArray变量。每次命中[时,它都会将currentArray放入输出并清除currentArray。最后它删除了第一个元素,因为输出的第一个元素将始终是一个空数组(因为输入的第一个元素以[开头)



var input = ["[3.0.0]","Features", "changes done in file","[2.0.1]", "Bug Fixes", "fixed login"];
var output = [];
var currentArray = [];
for (var i = 0; i < input.length; i++) {
  if (input[i].charAt(0) == '[') {
      output.push(currentArray);
      currentArray = [];
  }
  currentArray.push(input[i]);
}
output.push(currentArray);
currentArray = [];

//Since it will take the first one, and put empty one, need to do last step.

output.splice(0, 1);

console.log(output);
// ["[3.0.0]", "Features", "changes done in file"],
// ["[2.0.1]", "Bug Fixes", "fixed login"]
&#13;
&#13;
&#13;

答案 1 :(得分:0)

假设你总是以三人一组的形式工作,这是一种快速而丑陋的方法

var data = ["[3.0.0]","Features", "changes done in file","[2.0.1]", "Bug Fixes", "fixed login"],
    items = [];

data.map( (el, idx) => { 
    var last = items.length; 

  if( idx % 3 === 0 ) { 
    items.push( [] ); 
    last += 1; 
  }

  last = items[ last - 1 ]; 
  last.push( el ); 
} );

console.log( JSON.stringify( items ) );

答案 2 :(得分:0)

如果您愿意,可以使用以下替代解决方案:

const arr = ["[3.0.0]","Features", "changes done in file","[2.0.1]", "Bug Fixes", "fixed login"];
const newArr = [];
let tempArr = [];

arr.forEach(function(v, i) {
  if(/^\[\d+.\d+.\d\]$/.test(v) && i > 0) {
    newArr.push(tempArr);
    tempArr = [v];
  } else {
    tempArr.push(v)
  }
});

newArr.push(tempArr);
console.log(newArr);

此代码段逐个循环浏览项目。它使用两个数组,一个用于保存最终结果,另一个用于填充当前版本的项目。

我正在使用正则表达式检查项目是否包含一个[后跟一个数字,然后是句点,数字,句点,数字以及最后的]。这允许非版本标记的其他字符串包含该字符。

如果当前项是版本标记,我们将tempArr(包含我们之前在循环中填充的当前版本的更改)推送到结果数组newArr。然后,我们清空tempArr并为其指定下一个版本标记的起始值。

如果不是,我们只需将当前项目推送到临时数组。

答案 3 :(得分:0)

知道你是否可以保证以三元组格式获取这些数据会很有趣,正如你的例子所暗示的那样。如果您事先了解这一点,那么可能会出现许多创造性的解决方案。但是,对于仅创建2D数组,我喜欢这种方法(您可以直接在node.js中运行它来尝试它):

const original = ['[3.0.0]', 'Features', 'changes done in file', '[2.0.1]', 'Bug Fixes', 'fixed login']

function transformToChangeLog (originalArray) {
  const changeLog = originalArray.reduce((newList, element) => {
    element.charAt(0) === '[' // check for version string
      ? newList.push([element]) // If version string, then push a new Array containing that string
      : newList[newList.length - 1].push(element) // If something else, tack it onto the last Array in the changelog list
    return newList // whatever is returned in the reduce function is passed to the next iteration, allowing us to build this 2D array one element at a time. 
  }, [])

  return changeLog
}

console.log(transformToChangeLog(original))

我希望有所帮助!我喜欢reduce Array方法,因为它具有多功能性和简洁性。

相关问题