javascript - 在 Javascript 中按作者对对话数组进行排序

标签 javascript arrays lodash

我有一个很长的 txt 文件,其中包含以下格式的对话:

[19/12/17 16:30:36] A: ‎Los mensajes en este grupo ahora están protegidos con cifrado de extremo a extremo.
[19/12/17 16:31:23] B: Buenas tardes, bienvenidos
‎[19/12/17 16:31:36] B: ‎imagen omitida
[19/12/17 16:31:36] C: Hola!! ☺
[19/12/17 16:31:51] D: Hola!!!!
[19/12/17 16:32:10] B: Estamos aquí reunidos... bueno, todos sabéis ya para qué
[19/12/17 16:32:49] B: Formamos parte de un estudio de x relacionadas con la Lógica Convergente 😉
[19/12/17 16:34:32] E. Carvajal: Hola...!
[19/12/17 16:34:37] B: Antes de nada,(...) “lista de espera”
[19/12/17 16:37:23] C: Hola❗❗❗
[19/12/17 16:38:17] F: Por cierto como no os conozco a todos yo soy e 🙋‍♀
[19/12/17 16:39:19] G: Soy soy x🙋‍♂
[19/12/17 16:39:51] B: Yo x

我已经使用 split("[") 将 txt 文件拆分为一个数组。 我使用 [ 因为消息很长并且包含换行符。所有不属于时间戳的 [ 符号都会被转义。

到目前为止,这给了我一系列消息,如下所示:

1: "[timestamp] b: blabla"
2: "[timestamp] c: blabla"
3: "[timestamp] a: blabla"
(...)
3000: "[timestamp] b: blabla"

现在我需要根据作者将数组中的项目保存到不同的数组中,可能会循环遍历它并识别唯一的作者,作为每个项目中 ] 和 : 之间的文本的唯一作者。

最终结果应该是一个数组集合,其中每个数组都包含作者的消息集合:

[timestamp] c: blabla
[timestamp] c: blabla
[timestamp] c: blabla

然后:

[timestamp] b: blabla
[timestamp] b: blabla

等等。

我想我可以迭代数组并识别所有唯一的 "] 作者:" 然后将它们插入自己的数组中,但我对如何做有点迷失就是这样。

我记得当时用 Lodash 做了类似的事情,但我不记得函数的名称了。你会如何在 JS 中处理这样的事情?

最佳答案

我建议将每一行变成一个对象结构,这样你就会得到如下对象:

{ timestamp: "2019-01-01T12:13:44", author: "Helen", msg: "blablabla" }

您可以使用Map筛选各行,以收集作者的记录。

// Sample input:
const text = `[2019-01-02T12:03:08] john peterson: blabla
[2019-01-02T16:33:15] helen bloom: blabla
[2019-01-02T17:00:10] mark stanley: blabla
[2019-01-02T17:14:44] helen bloom: blabla
[2019-01-02T17:14:59] mark stanley: blabla
[2019-01-02T17:22:21] jenifer mcenroe: blabla`;

// Parse/structure the data:
const data = text
    .match(/.+/g) // Split into lines
    .map(line => line.match(/\[(.*?)\]\s*(.*?)\:\s*(.*)/)) // Pattern match
    .filter(Boolean) // Exclude non-matching lines
    // ... and structure into objects:
    .map(([, timestamp, author, msg]) => ({timestamp, author, msg}));     
// Create an array per author using a Map
const map = new Map(data.map(({author}) => [author, []]));
// Populate those arrays 
data.forEach(item => map.get(item.author).push(item)); 
// ...and extract them into the final result:
const result = Array.from(map.values()); 

console.log(result);

关于javascript - 在 Javascript 中按作者对对话数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55316332/

相关文章:

javascript - 在 TypeScript 中,如何在外部模块中扩展环境 JQuery 接口(interface)?

c - 数组与两个声明为 C 的数组连接

c - 分段故障

javascript - 使用 Underscore(或 Lodash),如何从另一个数组中删除一个数组的每个成员?

javascript - 构造js对象时如何根据条件进行对象属性赋值?

javascript - 如何在选择下拉选项时触发Vue中的功能

javascript - sweetalert2 : how to get autofocus on input?

javascript - 在页面加载时平滑滚动到所需的部分

javascript - 获取 URL 的最后两个参数 - javascript

javascript - 如果满足条件,Lodash 交换相邻的项目