Сортировка массива разговоров по автору в Javascript - PullRequest
0 голосов
/ 23 марта 2019

У меня очень длинный текстовый файл с беседой в следующем формате:

[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("["). Я использую [, поскольку сообщения длинные и содержат разрывы строк. Все знаки [, которые не являются частью метки времени, экранируются.

На данный момент это дает мне массив сообщений примерно так:

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

и т. Д.

Я полагаю, что мог бы выполнить итерацию по массиву и идентифицировать все уникальные "] author:", а затем поместить их в их собственный массив, но я немного растерялся, как поступить с этим.

Я помню, что делал что-то похожее с Лодашем, но не помню название функции. Как бы вы поступили примерно так в JS?

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Я бы предположил, что каждая строка превращается в объектную структуру, поэтому вы получаете такие объекты, как:

{ 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);
0 голосов
/ 23 марта 2019

Или просто так

const msgByAuthor = (messages, author) => {
  const regex = new RegExp('(.+)\\s'+ author +':(.*)', "gm");
  return messages.match(regex);
}

const messages = `Put messages here`;
console.log(msgByAuthor(messages, 'C'));

// Array ["[19/12/17 16:31:36] C: Hola!! ☺", "[19/12/17 16:37:23] C: Hola❗❗❗"]
0 голосов
/ 23 марта 2019

это может помочь, Object.entries(result) даст вам пару [author, messages], в то время как Object.values даст вам только сообщения

const groupByAuthor = src => src
  .split('\n')
  .reduce((res, row) => {
    const [, author] = /\] (\w):/.exec(row) || [];
    
    if (author) {
      res[author] = (res[author] || []).concat(row);
    }
    
    return res;
  }, {})
;


const source = `
[timestamp] a: "blabla 1"
[timestamp] b: "blabla 2"
[timestamp] c: "blabla 3"
[timestamp] b: "blabla 2"
[timestamp] c: "blabla 3"
[timestamp] d: "blabla 4"
`

const result = groupByAuthor(source);

console.log('result', result);
...