График журнала Git в массив

Мне нужно преобразовать вывод журнала git в объект.

Я использую команду git log --all --graph --oneline --date-order.

* 8896805 (origin/firstbranch) test(firstbranch): this is my commit on this branch
| * 5fef2da (HEAD -> testbranch, origin/another, another) refactor(another): this is a change
| * 2a34d72 refactor(another): typo
| * 683d704 refactor(another): changes
* |   0120274 Merge remote-tracking branch 'origin/develop' into firstbranch
|\ \

После этого я создал массив, где каждый элемент массива соответствует строке этого вывода.

И с этим я хотел бы иметь такой массив:

[
    {
        art: "*",
        commitHash: "8896805",
        branches: ["origin/firstbranch"],
        commitString: "test(firstbranch): this is my commit on this branch"
    },
    {
        art: "| *",
        commitHash: "5fef2da",
        branches: ["testbranch", "origin/another", "another"],
        commitString: "refactor(another): this is a change"
    },
    {
        art: "| *",
        commitHash: "2a34d72",
        branches: [],
        commitString: "refactor(another): typo"
    },
    {
        art: "| *",
        commitHash: "683d704",
        branches: [],
        commitString: "refactor(another): changes"
    },
    {
        art: "* |",
        commitHash: "0120274",
        branches: [],
        commitString: "Merge remote-tracking branch 'origin/develop' into firstbranch"
    },
    {
        art: "|\ \",
        commitHash: "",
        branches: [],
        commitString: ""
    }
]

Но я не могу получить этот результат.

Заранее спасибо!

Пожалуйста, поделитесь своими попытками.

Jeto 17.03.2019 15:09

Извините, но я удалил свои попытки, потому что я был не на правильном пути.

Nulji 17.03.2019 15:18

@Nulji, вы должны добавить это, это заставляет людей отвечать точнее, чтобы понять, что не так с вашими усилиями.

Code Maniac 17.03.2019 15:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
350
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать что-то подобное с регулярным выражением.

  1. alt регулярное выражение
    • ^\W+ — соответствует всем несловным символам в начале строки.
  2. commitHash регулярное выражение
    • \w+ - Это соответствует всем символам слова, и мы выбираем только первое совпадение
  3. branches регулярное выражение
    • /\(.*?\)/ - Это соответствует всем веткам ( branches here )
    • теперь из веток спичек заменяем (Head -> и () на replace
  4. commit регулярное выражение
    • /.*?\)|\W+/ — заменить все символы до первого ) или все символы, не являющиеся словами.

let str = `* 8896805 (origin/firstbranch) test(firstbranch): this is my commit on this branch
| * 5fef2da (HEAD -> testbranch, origin/another, another) refactor(another): this is a change
| * 2a34d72 refactor(another): typo
| * 683d704 refactor(another): changes
* |   0120274 Merge remote-tracking branch 'origin/develop' into firstbranch
|\\ \\`

let splited = str.split('\n')

let op = splited.map(inp=>{
  let alt = "" 
  inp = inp.replace(/^\W+/,(match)=>{alt=match; return ''})
  
  let commitHash = ''
  inp = inp.replace(/\s*(\w+)\s*/,(match,g1)=>{commitHash = g1;return ''})
  let branches = ''
  inp = inp.replace(/^\s*(\(.*?\))/,(match,g1)=>{branches = g1; return ''})
  branches = branches ? branches.replace(/^\s*\(HEAD\s*->\s*|[)(]/g,'').split(/\s*,\s*/) : []
  let commit = inp.trim()
  return {alt,commitHash,branches,commit}
})

console.info(op)

На стороне Примечание: - Обратите внимание, что это не полное доказательство. я рассмотрел случаи в соответствии с предоставленными данными, но может быть гораздо больше случаев

Спасибо, это почти то, что мне нужно. У меня просто проблема с вашим кодом: фиксация 2a34d72 и 683d704 в вашем примере не работает, потому что она дает мне ветку, но ее нет, тогда строка фиксации разбивается. Если вы можете исправить это быстро, огромное спасибо!

Nulji 17.03.2019 15:46

Я бы сказал, что немного стыдно использовать match дважды только для целей тернарного оператора. Вместо этого вы можете сделать let alt = (inp.match(/^\W+/) || [''])[0] (то же самое для других).

Jeto 17.03.2019 16:11

@Nulji, ты видишь, я внес некоторые изменения.

Code Maniac 17.03.2019 16:18

@Jeto да, я изменил его, замените совпавший, а затем продолжите, вы можете увидеть обновленный

Code Maniac 17.03.2019 16:19
Ответ принят как подходящий

Вот возможное решение с использованием одного регулярного выражения, затем обрезка для каждого значения и, наконец, расщепление разветвляется на массив:

const input = [
  '* 8896805 (origin/firstbranch) test(firstbranch): this is my commit on this branch',
  '| * 5fef2da (HEAD -> testbranch, origin/another, another) refactor(another): this is a change',
  '| * 2a34d72 refactor(another): typo',
  '| * 683d704 refactor(another): changes',
  '* |   0120274 Merge remote-tracking branch \'origin/develop\' into firstbranch',
  '|\\ \\'
];

const result = input.map(entry => {
  let [, alt, commitHash, branches, commitString] = entry
    .match(/^([|*\s\\]+)(?:\s+([a-f0-9]+)?(?:\s+\((?:HEAD\s+->\s+)?([^)]+)\))?(?:\s+(.*))?)?$/)
    .map(value => value ? value.trim() : '');
  branches = branches ? branches.split(/\s*,\s*/) : [];
  return {alt, commitHash, branches, commitString};
});

console.info(result);

Другие вопросы по теме